Skip to content

Commit 918b8ca

Browse files
committed
Update Java Notes
1 parent fd53025 commit 918b8ca

2 files changed

Lines changed: 1257 additions & 40 deletions

File tree

Java.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4677,7 +4677,7 @@ HashMap继承关系如下图所示:
46774677

46784678
* 为什么必须是 2 的 n 次幂?
46794679

4680-
HashMap 中添加元素时,需要根据 key 的 hash 值,确定在数组中的具体位置。HashMap 为了存取高效,要尽量较少碰撞,把数据尽可能分配均匀,每个链表长度大致相同,实现该方法的算法就是取模,hash%length,计算机中直接求余效率不如位移运算,所以源码中使用 hash&(length-1),实际上**hash % length == hash & (length-1)的前提是 length 是 2 的n次幂**
4680+
HashMap 中添加元素时,需要根据 key 的 hash 值,确定在数组中的具体位置。为了存取高效,要尽量较少碰撞,把数据尽可能分配均匀,每个链表长度大致相同,实现该方法的算法就是取模,hash%length,计算机中直接求余效率不如位移运算,所以源码中使用 hash&(length-1),实际上**hash % length == hash & (length-1)的前提是 length 是 2 的n次幂**
46814681

46824682
散列平均分布:2 的 n 次方是 1 后面 n 个 0,2 的 n 次方 -1 是 n 个 1,可以**保证散列的均匀性**,减少碰撞
46834683

@@ -4919,7 +4919,7 @@ HashMap继承关系如下图所示:
49194919
}
49204920
```
49214921

4922-
计算 hash 的方法:将 hashCode 无符号右移 16 位,高 16bit 和低 16bit 做了一个异或,扰动运算
4922+
计算 hash 的方法:将 hashCode 无符号右移 16 位,高 16bit 和低 16bit 做异或,扰动运算
49234923

49244924
原因:当数组长度很小,假设是 16,那么 n-1即为 1111 ,这样的值和 hashCode() 直接做按位与操作,实际上只使用了哈希值的后4位。如果当哈希值的高位变化很大,低位变化很小,就很容易造成哈希冲突了,所以这里**把高低位都利用起来,让高16 位也参与运算**,从而解决了这个问题
49254925

@@ -4938,7 +4938,7 @@ HashMap继承关系如下图所示:
49384938

49394939
存储数据步骤(存储过程):
49404940

4941-
1. 先通过 hash 值计算出 key 映射到哪个桶
4941+
1. 先通过 hash 值计算出 key 映射到哪个桶,哈希寻址
49424942

49434943
2. 如果桶上没有碰撞冲突,则直接插入
49444944

@@ -9513,7 +9513,7 @@ JVM的生命周期分为三个阶段,分别为:启动、运行、死亡。
95139513
- 执行一个 Java 程序时,真真正正在执行的是一个 Java 虚拟机的进程
95149514
- JVM 有两种运行模式 Server 与 Client,两种模式的区别在于:Client 模式启动速度较快,Server 模式启动较慢;但是启动进入稳定期长期运行之后 Server 模式的程序运行速度比 Client 要快很多
95159515

9516-
Server 模式启动的 JVM 采用的是重量级的虚拟机,对程序采用了更多的优化,而 Client 模式启动的 JVM 采用的是轻量级的虚拟机
9516+
Server 模式启动的 JVM 采用的是重量级的虚拟机,对程序采用了更多的优化Client 模式启动的 JVM 采用的是轻量级的虚拟机
95179517
- **死亡**:
95189518

95199519
- 当程序中的用户线程都中止,JVM 才会退出
@@ -10327,15 +10327,14 @@ public void localvarGC4() {
1032710327

1032810328
- 虚拟机栈中局部变量表中引用的对象:各个线程被调用的方法中使用到的参数、局部变量等
1032910329
- 本地方法栈中引用的对象
10330-
- 方法区中类静态属性引用的对象
10330+
- 堆中类静态属性引用的对象
1033110331
- 方法区中的常量引用的对象
1033210332
- 字符串常量池(string Table)里的引用
1033310333
- 同步锁 synchronized 持有的对象
1033410334

10335-
GC Roots说明:
1033610335

10337-
* **GC Roots是一组活跃的引用,不是对象**,放在 GC Roots Set 集合
10338-
* 如果一个指针保存了堆内存中的对象,但自己不在堆内存中,它就是一个Root
10336+
10337+
**GC Roots是一组活跃的引用,不是对象**,放在 GC Roots Set 集合
1033910338

1034010339

1034110340

0 commit comments

Comments
 (0)