前言
全文总共分为28部分,从原码、反码、补码一直到网络编程,因为内容实在是太多了 ,所以小编只把部分知识点拿出来粗略的介绍了一下,每个小节都有跟家细化的内容,希望大家能够理解与喜欢!!
1.原码、反码、补码
1. 原码、反码、补码
1.1. 原码
将最高位作为符号位(以
0 代表正, 1 代表负),其余各位代表数值本身的绝对值(以二进制表示) 。
为了简单起见,我们用1 个字节来表示一个整数:
+7 的原码为:00000111
-7 的原码为:10000111
问题:
0 的原码为:00000000
-0 的原码为:10000000
1.2. 反码
一个数如果为正,则它的反码与原码相同;
一个数如果为负,则符号位为1,其余各位是对原码取反。
为了简单起见,我们用1 个字节来表示一个整数:
+7 的反码为:00000111
-7 的反码为:11111000
问题:
+0 的反码为:00000000
-0 的反码为:11111111
1.3. 补码
利用溢出,我们可以将减法变成加法。
对于十进制数,如果从9 得到结果 5,可以用减法: 9-4=5;
因为 4+6=10,我们将 6 作为 4 的补数,将上式的减法改写为加法:
9+6=15;
去掉高位 1(也就是减去 10),得到结果 5。
对于 16 进制数,如果从C 得到结果 5,可以用减法: C-7=5;
因为 7+9=16,我们将 9 作为 7 的补数,将上式的减法改写为加法:
C+9=15 ;
去掉高位 1(也就是减去 16),得到结果 5。
在计算机中,如果我们用1 个字节表示一个数,一个字节有8 位,超过 8 位就进 1,在内存中情况为: 1 00000000,进位 1 被丢弃。
一个数如果为正,则它的原码、反码、补码相同;
一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。
为了简单起见,我们用1 个字节来表示一个整数。
+7 的补码为:00000111
-7 的补码为:11111001
1.4. 负数的补码转换为十进制数
a、 先对各位取反;
b、 将其转换为十进制数;
c、 加上负号,再减去1。
例如: 11111010,最高位为 1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得 -5,再减 1 得-6。
2.char
3.运算符
3.1.移位运算符
3.2.位运算符
3.3.逻辑运算符
4.流程控制
4.1.switch
4.2.break 和 continue
5.方法
5.1.构造方法
5.2.方法重载
6.this
7.继承
7.1.super
7.2.多态( polymorphism )
7.3.instanceof
8.static
9.final
10.abstract
11.类的加载
11.1.触发类加载的几种情况
11.2.类加载的顺序
12.接口( interface)
13.访问控制
14.Object 类
14.1.clone()
14.1.1.对象克隆过程
14.1.2.浅复制和深复制概念
14.2.finalize()
14.3.equals(Object obj)
14.4.toString()
15.String 类及对象池
15.1.String a="hello";
15.2.String c=new String("hello");
16.StringBuffer 和 StringBuilder
17.主方法参数
18.方法的可变长参数
19.包装类
19.1.Number
19.2.自动封箱 /自动解封( Autoboxing/Unboxing )
19.3.对象池
20.内部类
20.1.意义
20.2.四种形式的内部类
20.2.1.静态内部类
20.2.2.成员内部类
20.2.3.局部内部类
20.2.4.匿名内部类
20.3.内部类的应用
21.集合框架 (Collection Framework)
21.1.Iterator 接口和 Iterable 接口
21.2.Connection 接口和 Connections 类
21.2.1.java.util.Collection
21.2.2.java.util.Collections
21.3.List(列表)接口
21.3.1.ArrayList
21.3.2.LinkedList
21.3.3.Vector
21.4.Set(集合)接口
21.4.1.HashSet
21.4.2.TreeSet
21.5.排序的两种办法
21.5.1.java.lang.Comparable(可比较的)
21.5.2.java.util.Comparator( 比较器 )
21.6.Map
21.6.1.HashMap
21.6.2.Hashtable
21.6.3.Hashtable 下的子类 Properties 类
21.6.4.SortedMap 接口下的 TreeMap 类
22.泛型 (Generic)
22.1.泛型特点
22.2.通配符
22.2.1.上限通配符:
22.2.2.下限通配符
22.2.3.总结:
22.3.运用
23.异常
23.1.异常处理基础
23.2.异常的类继承结构
23.3.常见的未检查异常
23.4.throw
23.5.自定义异常类
24.反射( Reflection )
24.1.反射需要用到的类
24.1.1.java.lang.Class
24.1.2.java.lang.reflect.Field
24.1.3.java.lang.Package
24.1.4.java.lang.relect.Modifier
24.1.5.java.lang.reflect.Mothed
24.1.6.java.lang.reflect.Array
24.1.7.java.lang.reflect.Constructor
24.2.三种获得某个类的Class 对象的方法
24.2.1.Class c=Class.forName(" 类名 ");
24.2.2.Class c=类名 .class;
24.2.3.Class c=对象名 .getClass();
24.3.所能探查出来的类的特征
24.4.通过反射生成一个类的实例
24.4.1.第一种方法
24.4.2.第二种方法
25.File
25.1.构造方法
25.2.重点方法
25.3.目录
26.流
26.1.字节流
26.2.字符流
26.3.节点流 (Node Stream)
26.4.过滤流 (Filter Stream)
26.5.ObjectInputStream 和 ObjectOutputStream
26.6.字节流转化成字符流的桥转换器
26.7.文本文件和二进制文件
27.线程
27.1.概念与原理
27.1.1.操作系统中线程和进程的概念
27.1.2.Java中的线程
27.1.3.Java中的线程模型
27.1.4.一些常见问题
27.2.线程状态的转换
27.2.1.线程的七种状态
27.2.2.阻止线程执行
27.3.线程的同步与锁 .
27.3.1.同步和锁定
27.3.2.静态方法同步
27.3.3.如果线程不能获得锁会怎么样
27.3.4.何时需要同步
27.3.5.线程安全类
27.3.6.线程死锁
27.3.7.线程同步小结
27.4.线程的交互
27.4.1.线程交互的基础知识
27.4.2.多个线程在等待一个对象锁时候使用notifyAll() .
27.5.守护线程(后台服务线程)
27.6.并发协作 -生产者消费者模型
27.7.volatile 关键字
28.网络编程
28.1.TCP Socket 编程
TCP 是 Tranfer Control Protocol 的简称,是一种 面向连接的保证可靠传输的协议。通过TCP 协议传输, 得到的是一个 顺序的无差错的数据流。
发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP 协议的基础上进行通信,当一个socket(通常都是 serversocket)等待建立连接时,另一个socket 可以要求进行连接,一旦这两个socket 连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个 Socket。Socket 通常用来实现客户方和服务方的连接。
Socket 是 TCP/IP 协议的一个十分流行的编程界面,一个 Socket由一个 IP 地址和一个端口号唯一确定。
Socket:套接字是两台机器间通信的端点。是为了简化网络编程的复杂度而由开发语言提供的一个网络编程接口。
可以在网络上建立机器和机器之间可靠的、双向的、 持续的、点对点的流式连接。
传统的 Socket 编程(阻塞的,串行)
传统的基于多线程的
Socket 编程(阻塞的,并发)
基于多线程和 NIO 的非阻塞编程
阻塞的含义 :执行这些方法时, 只有这些方法有返回结果的情况下,程序才能继续运行,
否则执行该方法的进程或线程处于阻塞等待状态。
java.net 包中提供了两个类Socket 和 ServerSocket,分别用来表示双向连接的客户端和服务端。28.1.1. ServerSocket
创建一个 TCP 服务器端程序的步骤:
1). 创建一个 ServerSocket
ServerSocket ss= new ServerSocket(post) //只需要用端口号构造拿当前运行的应用程序,向系统申请一个端口号,并绑定该端口号。
2). 从 ServerSocket 接受客户连接请求
Socket s = server.accept();
3). 创建一个服务线程处理新的连接
4). 在服务线程中,从socket中获得 I/O 流ObjectInputStream put=new ObjectInputStream(s.getInputStream());
ObjectOutputStreamo put=newObjectOutputStream(s.getOutputStream());
5). 对 I/O 流进行读写操作,完成与客户的交互
6). 关闭 I/O 流
7). 关闭 Socket
28.1.2. Socket
建立 TCP 客户端
创建一个 TCP 客户端程序的步骤:
1).创建 Socket
Socket connection = new Socket(127.0.0.1, 7777);
2). 获得 I/O 流
3). 对 I/O 流进行读写操作
4). 关闭 I/O 流
5). 关闭 Socket
类 Socket提供了方法 getInputStream()和 getOutStream()来得到对应的输入 /输出流以进行读/写操作,这两个方法分别返回InputStream 和 OutputSteam 类对象。为了便于读/写数据,我们可以在返回的输入/输出流对象上建立过滤流,如
DataInputStream、 DataOutputStream
或 PrintStream 类 对 象 , 对 于 文 本 方 式 流 对 象 , 可 以 采 用 InputStreamReader 和
OutputStreamWriter 、PrintWirter 等处理。
例如:
PrintStream os=newPrintStream(newBufferedOutputStreem(socket. getOutputStream()));
DataInputStreamis=newDataInputStream(socket.getInputStream());
PrintWriterout=newPrintWriter(socket.getOutStream(),true);
BufferedReaderin=
newButfferedReader(newInputSteramReader(Socket. getInputStream()));
每一个 Socket 存在时,都将占用一定的资源,在
Socket 对象使用完毕时,要其关闭。
关闭 Socket 可以调用 Socket 的 Close() 方法。在关闭 Socket 之前,应将与Socket 相关的所有的输入 /输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket 相关的所有的输入 /输出该首先关闭,然后再关闭Socket。
os.close(); is.close();
socket.close();
28.2.UDP Socket编程
相比而言 UDP 的应用不如 TCP 广泛,几个标准的应用层协议HTTP ,FTP,SMT 使用的都是 TCP 协议。但是,随着计算机网络的发展,UDP 协议正越来越来显示出其威力,尤其是在需要很强的实时交互性的场合,如网络游戏,视频会议等,UDP 更是显示出极强的威力,下面我们就介绍一下Java 环境下如何实现UDP 网络传输。
TCP,可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。
UDP,不可靠,差错控制开销较小,传输大小限制在
64K 以下,不需要建立连接。
***************************************************************************
UDP(User Datagram Protocol):
是一种面向非连接的协议,
在正式通信前不必与对方先建立连接,不管对方状态就直接发送。 每个数据包都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地, 到达目的地的时间以及内容的正确性都是不能被保证的。这与现在手机短信非常相似。
UDP 适用于一次只传送少量数据、对可靠性要求不高的应用环境。
例如“ ping”命令可用来测试两台主机之间TCP/IP 通信是否正常:一次向对方主机发送 4 个 UDP 数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的,否则网络连接不正常。
正因为 UDP 协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠
性不如 TCP 协议高。 QQ 就使用 UDP 发消息,因此有时会出现收不到消息的情况。
28.2.1. DatagramSocket
用于在程序之间建立传送数据包的通信连接,DatagramPacket 则用来表示一个数据包。
先来看一下 DatagramSocket 的构造方法:
DatagramSocket();
DatagramSocket(int port );
DatagramSocket(int port, InetAddress laddr)
其中, port 指明 socket 所使用的端口号, 如果未指明端口号, 则把 socket 连接到本地主机上一个可用的端口。
laddr 指明一个可用的本地地址。
用数据包方式编写client/server 程序时,无论在客户方还是服务方,首先都要建立一个DatagramSocket 对象,用来接收或发送数据包,然后使用 DatagramPacket 类对象作为传输数据的载体。
28.2.2. DatagramPacket
构造方法 :
用于接收:
DatagramPacket(byte buf[],int length) ;DatagramPacket(byte[] buf, int offset, int length) ;
用于发送:DatagramPacket(byte buf[], int length, InetAddress addr, int port);
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) ;
其中, buf 中存放数据包数据, length 为数据包中数据的长度,addr 和 port 旨明目的地
址, offset 指明了数据包的位移量。
在接收数据前,应该采用上面的第一种方法生成一个DatagramPacket 对象,给出接收
数据的缓冲区及其长度。然后调用DatagramSocket 的方法 receive()等待数据包的到来,receive()将一直等待,直到收到一个数据包为止。
DatagramPacket packet=new DatagramPacket(buf, 256);
Socket.receive (packet);
发送数据包前,也要先生成一个新的DatagramPacket 对象,这时要使用上面的第二种构造方法,在给出存放发送数据的缓冲区的同时,还要给出完整的目的地址,包括IP 和端口号。发送数据是通过DatagramSocket 的方法 send()实现的, send()根据数据包的目的地址来寻径,以传递数据包。
DatagramPacket packet=new DatagramPacket(buf, length, address, port);
Socket.send(packet);
因篇幅限制,小编在这里就不做过多的介绍了,需要完整版java全套详细笔记资料的朋友转发关注小编后👇👇👇
希望大家学习完本文后,能够提升自己的技术深度和宽度,能够拿到更高的薪资和待遇~~~
网友评论