Skip to content

Commit e43d982

Browse files
committed
Update Java Notes
1 parent 5326558 commit e43d982

File tree

1 file changed

+43
-106
lines changed

1 file changed

+43
-106
lines changed

Java.md

Lines changed: 43 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -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

41994203
2. 增强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

52435246
12. 调整大小下一个容量的值计算方式为(容量*负载因子)
52445247

5245-
```java
5248+
```java
52465249
//临界值,当实际大小(容量*负载因子)超过临界值时,会进行扩容
52475250
int threshold;
5248-
```
5251+
```
52495252

52505253
13. **哈希表的加载因子(重点)**
52515254

@@ -5439,10 +5442,12 @@ transient int size;
54395442

54405443
4. 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
![](https://gitee.com/seazean/images/raw/master/Java/HashMap-resize扩容.png)
@@ -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

Comments
 (0)