HashMap 1.8 源码解析-数组+链表/红黑树

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/89286446

类变量: 

//默认hash桶初始长度16
  static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //左边数组的长度

  //hash表最大容量2的30次幂
  static final int MAXIMUM_CAPACITY = 1 << 30; //左边数组的长度

  //默认负载因子 0.75
  static final float DEFAULT_LOAD_FACTOR = 0.75f;

  //某个节点链表的元素总数大于等于8并且左边数组的长度大于等于64时,该链表树化 
  static final int TREEIFY_THRESHOLD = 8;

  //hash表某个节点链表的元素总数小于等于6时树拆分
  static final int UNTREEIFY_THRESHOLD = 6;

  //树化时最小桶的数量(左边数组的长度)
  static final int MIN_TREEIFY_CAPACITY = 64;

扩容时:

如果是红黑树,需要进行树拆分然后映射,此时会拆分为两个子树,并且如果某个子树的节点总数小于等于6时,该子树会拆分为链表
如果是多个元素的链表,将原链表拆分为两个链表,两个链表的索引位置,一个为原索引,一个为原索引加上旧Hash桶长度的偏移量

详情可见:https://zhuanlan.zhihu.com/p/34280652

以上基于jdk1.8

更多可见:ArrayList,Vector,HashMap的扩容区别

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/89286446