@@ -77,7 +77,7 @@ static int hash(int h) {
77
77
78
78
相比于之前的版本,JDK1.8 以后在解决哈希冲突时有了较大的变化。
79
79
80
- 当链表长度大于阈值(默认为 8)时,会首先调用 ` treeifyBin() ` 方法, 这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行 ` resize() ` 方法对数组扩容。相关源码这里就不贴了,重点关注 ` treeifyBin() ` 方法即可!
80
+ 当链表长度大于阈值(默认为 8)时,会首先调用 ` treeifyBin() ` 方法。 这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行 ` resize() ` 方法对数组扩容。相关源码这里就不贴了,重点关注 ` treeifyBin() ` 方法即可!
81
81
82
82
![ ] ( https://oscimg.oschina.net/oscnet/up-bba283228693dae74e78da1ef7a9a04c684.png )
83
83
@@ -265,12 +265,12 @@ HashMap 只提供了 put 用于添加元素,putVal 方法只是给 put 方法
265
265
1. 如果定位到的数组位置没有元素 就直接插入。
266
266
2. 如果定位到的数组位置有元素就和要插入的 key 比较,如果 key 相同就直接覆盖,如果 key 不相同,就判断 p 是否是一个树节点,如果是就调用`e = ((TreeNode<K ,V > )p). putTreeVal(this , tab, hash, key, value)`将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。
267
267
268
- 说明 : 下图有两个小问题:
268
+ ! [ ](https : // my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/put方法.png)
269
269
270
- - [issue#608 ](https: // github.com/Snailclimb/JavaGuide/issues/608)指出:直接覆盖之后应该就会 return,不会有后续操作。参考 JDK8 HashMap.java 658 行。
271
- - 当链表长度大于阈值(默认为 8 )并且 HashMap 数组长度超过 64 的时候才会执行链表转红黑树的操作,否则就只是对数组扩容。参考 HashMap 的 `treeifyBin()` 方法
270
+ 说明: 上图有两个小问题:
272
271
273
- ! [ ](https: // my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/put方法.png)
272
+ - 直接覆盖之后应该就会 return ,不会有后续操作。参考 JDK8 HashMap . java 658 行([issue#608 ](https: // github.com/Snailclimb/JavaGuide/issues/608))。
273
+ - 当链表长度大于阈值(默认为 8 )并且 HashMap 数组长度超过 64 的时候才会执行链表转红黑树的操作,否则就只是对数组扩容。参考 HashMap 的 `treeifyBin()` 方法([issue#1087 ](https: // github.com/Snailclimb/JavaGuide/issues/1087))。
274
274
275
275
```java
276
276
public V put(K key, V value) {
@@ -306,7 +306,9 @@ final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
306
306
if ((e = p. next) == null ) {
307
307
// 在尾部插入新结点
308
308
p. next = newNode(hash, key, value, null );
309
- // 结点数量达到阈值,转化为红黑树
309
+ // 结点数量达到阈值(默认为 8 ),执行 treeifyBin 方法
310
+ // 这个方法会根据 HashMap 数组来决定是否转换为红黑树。
311
+ // 只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是对数组扩容。
310
312
if (binCount >= TREEIFY_THRESHOLD - 1 ) // -1 for 1st
311
313
treeifyBin(tab, hash);
312
314
// 跳出循环
0 commit comments