@@ -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