欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jdk1.8的HashMap的源码解读

程序员文章站 2022-06-04 18:50:43
...

jdk 1.8下的HashMap 是通过数组加链表+红黑树构成
数组:Node<K,V>[] table
要想又链表转化成红黑树要满足一下两点
1、链表的长度要达到8(实际是9个)

for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);  
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }

2、数组的最小长度》=64
否则进行扩容
注意 当数组大小小于64时一定不可能有红黑树

TreeNode<K,V> p = replacementTreeNode(e, null);由单向链表变成双向  ,
Node ->treeNode的转化

Fail-Fast 机制
我们知道 java.util.HashMap 不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。这一策略在源码中的实现是通过 modCount 域,modCount 顾名思义就是修改次数,对HashMap 内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的 expectedModCount。在迭代过程中,判断 modCount 跟 expectedModCount 是否相等,如果不相等就表示已经有其他线程修改了 Map:注意到 modCount 声明为 volatile,保证线程之间修改的可见性。

相关标签: 学习记录