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,保证线程之间修改的可见性。