@@ -1542,7 +1542,6 @@ static 静态修饰的成员(方法和成员变量)属于类本身的。
15421542 }
15431543 }
15441544 ```
1545-
15461545
15471546
15481547
@@ -2667,9 +2666,7 @@ Object类常用方法:
26672666 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址,例:Student@735b478;
26682667 直接输出对象名称,默认会调用toString()方法,所以省略toString()不写;
26692668 如果输出对象的内容,需要重写toString()方法,toString方法存在的意义是为了被子类重写
2670- * `public boolean equals(Object o)`:
2671- 默认是比较两个对象的内容是否相同,如果只是比较两个对象的地址可以用“==”替代equals
2672- 所以equals存在的意义是为了被子类重写,以便程序员可以自己来定制比较规则
2669+ * `public boolean equals(Object o)`:默认是比较两个对象的引用是否相同
26732670* `protected Object clone()`:创建并返回此对象的副本
26742671
26752672只要两个对象的内容一样,就认为是相等的:
@@ -2689,8 +2686,15 @@ public boolean equals(Object o) {
26892686```
26902687
26912688**面试题**:== 和equals的区别
2692- == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的**地址**是否相同,即是否是**指相**同一个对象。比较的是真正意义上的指针操作。
2693- equals用来比较的是两个对象的**内容**是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断
2689+
2690+ * == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的**地址**是否相同,即是否是指相同一个对象,比较的是真正意义上的指针操作。
2691+ * 重写equals方法比较的是两个对象的**内容**是否相等,所有的类都是继承自java.lang.Object类,所以适用于所有对象,如果**没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,比较两个对象的引用**
2692+
2693+ hashCode的作用:
2694+
2695+ * hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,可以在散列存储结构中确定对象的存储地址
2696+ * 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同
2697+ * 哈希值相同的数据不一定内容相同,内容相同的数据哈希值一定相同
26942698
26952699
26962700
@@ -3511,7 +3515,7 @@ public class BigDecimalDemo {
35113515 3. 四则运算中的除法,如果除不尽请使用divide的三个参数的方法。
35123516
35133517 ```java
3514- BigDecimal divide = bd1.divide(参与运算的对象,小数点后精确到多少位,舍入模式);
3518+ BigDecimal divide = bd1.divide(参与运算的对象,小数点后精确到多少位,舍入模式);
35153519 参数1:表示参与运算的BigDecimal 对象。
35163520 参数2:表示小数点后面精确到多少位
35173521 参数3:舍入模式
@@ -4198,7 +4202,6 @@ Collection集合的遍历方式有三种:
41984202
419942032. 增强for循环
42004204 增强for循环是一种遍历形式,可以遍历集合或者数组,遍历集合实际上是迭代器遍历的简化写法
4201-
42024205```java
42034206 for(被遍历集合或者数组中元素的类型 变量名称 : 被遍历集合或者数组){
42044207
@@ -4918,7 +4921,7 @@ HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,
49184921* key是唯一不重复的,底层的哈希表结构,依赖hashCode方法和equals方法保证键的唯一
49194922* key、value都可以为null,但是键位置只能是一个null
49204923* HashMap中的映射不是有序的,即存取是无序的
4921- * 如果键要存储的是自定义对象 ,需要重写hashCode和equals方法
4924+ * **key要存储的是自定义对象 ,需要重写hashCode和equals方法,防止出现地址不同内容相同的key**
49224925
49234926对比Hashtable:
49244927
@@ -5242,10 +5245,10 @@ transient int size;
52425245
5243524612. 调整大小下一个容量的值计算方式为(容量*负载因子)
52445247
5245- ```java
5248+ ```java
52465249 //临界值,当实际大小(容量*负载因子)超过临界值时,会进行扩容
52475250 int threshold;
5248- ```
5251+ ```
52495252
5250525313. **哈希表的加载因子(重点)**
52515254
@@ -5439,10 +5442,12 @@ transient int size;
54395442
544054434. resize
54415444
5442- 当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容。进行扩容,会伴随着一次重新hash分配, 并且会遍历hash表中所有的元素,是非常耗时的 ,所以要尽量避免resize
5445+ 当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容。扩容会伴随着一次重新hash分配, 并且会遍历hash表中所有的元素,非常耗时 ,所以要尽量避免resize
54435446
54445447 HashMap在进行扩容时,使用的rehash方式非常巧妙,因为每次扩容都是翻倍,与原来计算的 (n-1)&hash的结果相比,只是多了一个bit位,节点**要么就在原来的位置,要么就被分配到"原位置+旧容量"的位置**
54455448
5449+ 判断:当前数组长度n为1的位为 x,如果key的哈希值 x 位也为1,则扩容后的索引为 now + n
5450+
54465451 注意:这里也要求**数组长度2的幂**
54475452
54485453
@@ -6599,7 +6604,7 @@ class Student{
65996604
66006605
66016606
6602- #### 收集Stream流
6607+ #### 收集流
66036608
66046609收集Stream流的含义:就是把Stream流的数据转回到集合中去。
66056610
@@ -7780,7 +7785,7 @@ public class CommonsIODemo01 {
77807785
77817786## 网络
77827787
7783- ### 网络概述
7788+ ### 概述
77847789
77857790#### 软件结构
77867791
@@ -7828,35 +7833,35 @@ public class CommonsIODemo01 {
78287833
78297834#### 分层和协议
78307835
7831- 网络通信协议:
7832- 通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。
7836+ 网络通信协议:对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信
78337837
7834- > 应用层:应用程序(QQ,微信,浏览器), 可能用到的协议(HTTP,FTP,SMTP),通常程序员只需要这一层
7838+ > 应用层:应用程序(QQ,微信,浏览器), 可能用到的协议(HTTP,FTP,SMTP)
78357839>
7836- > 传输层:TCP/IP协议 - UDP协议,计算机网络工程师需要精通的协议,有些技术我们也需要精通
7840+ > 传输层:TCP/IP协议 - UDP协议
78377841>
7838- > 网络层 :IP协议 封装自己的IP和对方的IP和端口
7842+ > 网络层 :IP协议, 封装自己的IP和对方的IP和端口
78397843>
78407844> 数据链路层 : 进入到硬件(网)
7841- >
78427845
7843- TCP/IP协议:传输控制协议 (Transmission Control Protocol)。
7844- TCP协议是面向连接的安全的可靠的传输通信协议。
7845- 1.在通信之前必须确定对方在线并且连接成功才可以通信。
7846- 2.例如下载文件、浏览网页等(要求可靠传输)
7846+ TCP/IP协议:传输控制协议 (Transmission Control Protocol)
7847+
7848+ TCP:面向连接的安全的可靠的传输通信协议
7849+
7850+ * 在通信之前必须确定对方在线并且连接成功才可以通信
7851+ * 例如下载文件、浏览网页等(要求可靠传输)
78477852
7848- UDP:用户数据报协议(User Datagram Protocol)。
7849- UDP协议是一个面向无连接的不可靠传输的协议。
7850- 1. 直接发消息给对方,不管对方是否在线,发消息后也不需要确认。
7851- 2. 无线(视频会议,通话),性能好,可能丢失一些数据!!
7853+ UDP:用户数据报协议(User Datagram Protocol),是一个面向无连接的不可靠传输的协议
7854+
7855+ * 直接发消息给对方,不管对方是否在线,发消息后也不需要确认
7856+ * 无线(视频会议,通话),性能好,可能丢失一些数据
78527857
78537858
78547859
78557860****
78567861
78577862
78587863
7859- ### 通信模型
7864+ #### 通信模型
78607865
78617866相关概念:
78627867
@@ -7899,13 +7904,11 @@ UDP:用户数据报协议(User Datagram Protocol)。
78997904
79007905
79017906
7902-
7903-
79047907****
79057908
79067909
79077910
7908- ### InetAddress
7911+ ### Inet
79097912
79107913一个该InetAddress类的对象就代表一个IP地址对象。
79117914
@@ -7966,15 +7969,15 @@ UDP协议相关的两个类
79667969
79677970**DatagramPacket**:
79687971
7969- * DatagramPacket类构造器
7972+ * DatagramPacket类
79707973 * `public new DatagramPacket(byte[] buf, int length, InetAddress address, int port)` : 创建发送端数据包对象
79717974 参数: buf:要发送的内容,字节数组 length:要发送内容的长度,单位是字节
79727975 address:接收端的IP地址对象 port:接收端的端口号
79737976 * `public new DatagramPacket(byte[] buf, int length)` : 创建接收端的数据包对象
79747977 参数:buf:用来存储接收到内容 length:能够接收内容的长度
79757978* DatagramPacket类常用方法
79767979 `public int getLength()` : 获得实际接收到的字节个数
7977- `public byte[] getData()` : 返回数据缓冲区
7980+ `public byte[] getData()` : 返回数据缓冲区
79787981
79797982**DatagramSocket**:
79807983
@@ -8517,58 +8520,6 @@ public class Server {
85178520
85188521
85198522
8520-
8521-
8522- ***
8523-
8524-
8525-
8526- ### BS
8527-
8528- 客户端:浏览器。(无需开发)
8529- 服务端:自己开发。
8530- 需求:在浏览器中请求本程序,响应一个网页文字给浏览器显示
8531-
8532- ```java
8533- public class BSServerDemo {
8534- public static void main(String[] args) {
8535- try{
8536- ServerSocket ss = new ServerSocket(8080);
8537- //建一个循环接收多个客户端的请求。
8538- while(true){
8539- Socket socket = ss.accept();
8540- new ServerReaderThread(socket).start();
8541- }
8542- }catch(Exception e){
8543- e.printStackTrace();
8544- }
8545- }
8546- }
8547- class ServerReaderThread extends Thread{
8548- private Socket socket;
8549- public ServerReaderThread(Socket socket) {this.socket = socket;}
8550- @Override
8551- public void run() {
8552- try{
8553- // 响应消息数据给浏览器显示。浏览器是基于HTTP协议通信!
8554- // 响应格式必须满足HTTP协议数据格式的要求,浏览器才能够识别,否则响应消息浏览器不认识
8555- PrintStream ps = new PrintStream(socket.getOutputStream());
8556- ps.println("HTTP/1.1 200 OK"); // 响应数据的响应头数据!
8557- ps.println("Content-Type:text/html;charset=UTF-8");//响应数据的类型网页或者文本内容!
8558- ps.println(); // 必须换一行
8559- // 以下开始响应真实的数据!!
8560- ps.println("<span style='color:green;font-size:100px;'>牛逼的128期<span>");
8561- Thread.sleep(4000);//防止数据没收到
8562- ps.close();
8563- }catch (Exception e) {
8564- e.printStackTrace();
8565- }
8566- }
8567- }
8568- ```
8569-
8570-
8571-
85728523***
85738524
85748525
@@ -14429,7 +14380,6 @@ JDK 自带了监控工具,位于 JDK 的 bin 目录下,其中最常用的是
1442914380
1443014381* jconsole:用于对 JVM 中的内存、线程和类等进行监控;
1443114382* jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等
14432-
1443314383
1443414384
1443514385
@@ -14511,7 +14461,7 @@ JDK 自带了监控工具,位于 JDK 的 bin 目录下,其中最常用的是
1451114461* 需要等待结果返回,才能继续运行就是同步
1451214462* 不需要等待结果返回,就能继续运行就是异步
1451314463
14514-
14464+ 萨克尽快撒娇看啊是卡接口
1451514465
1451614466
1451714467
@@ -15367,6 +15317,10 @@ Mark Word 中就被设置指向 Monitor 对象的指针,这就是重量级锁
1536715317
1536815318* 普通对象(32位系统,64位128位):
1536915319
15320+ * 对象头第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,就是Mark Word
15321+
15322+ * 对象头的另外一部分是类型指针,即是对象指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
15323+
1537015324 ```ruby
1537115325 |-----------------------------------------------------|
1537215326 | Object Header (64 bits) |
@@ -19293,12 +19247,7 @@ class MockConnection implements Connection {
1929319247
1929419248单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,
1929519249该模式的这个类永远只有一个实例。即**一个类永远只有一个对象实例**。
19296- 单例是为了节约内存,单例在有些业务场景下还必须用到!!
19297-
19298- > 单例的应用场景:
19299- > 在实际开发中,有很多业务对象永远只需要一个,无论启动多少次
19300- > 我们只需要一个对象,例如任务管理对象,只需要一个对象。节约内存和性能。
19301- > 因为对象越多内存占用越大,极有可能出现内存溢出!
19250+ 单例是为了节约内存,单例在有些业务场景下还必须用到
1930219251
1930319252* 饿汉单例设计模式
1930419253 在用类获取对象的时候,对象已经提前创建好了。
@@ -19588,18 +19537,6 @@ public class BufferedInputStrem extends InputStream {
1958819537
1958919538
1959019539
19591- ***
19592-
19593-
19594-
19595-
19596-
19597- # Java
19598-
19599-
19600-
19601-
19602-
1960319540
1960419541
1960519542
0 commit comments