HashMap

2020-07-10  本文已影响0人  Doctor_Xu

简介

HashMap和HashTable类似,数据结构细节有一切不同,HashTable的存储结构为数组加链表,HashMap的存储结构为数组+链表+红黑树,当链表的长度大于8时,则转换为红黑树,当转换为红黑树后,树的节点数小于6后,又转换为链表。

树化最小阈值,当链表长度大于8时,链表数据存储结构转换为红黑树的数值存储结构
static final int TREEIFY_THRESHOLD = 8;
链表化最小阈值,当树中节点数小于6时,红黑树的数据存储结构转换为链表的数据存储结构
static final int UNTREEIFY_THRESHOLD = 6;
a. 链表转换为树的最小阈值,并不是链表长度大于等于8后就马上把存储结构变成树型,
b. 这有一个前提,即:HashMap的capacity必须得大于这个值才可以转换,
c. 如果capacity小于64,当插入数据导致链表长度大于8,此时先进行扩容,并不会树型化链表
d. 扩容后如果capacity大于64,当插入数据时导致链表的长度大于8,且元素个数没有超过threshold,则树型化
e. 为了避免树型化和扩容这两种方案发生冲突,MIN_TREEIFY_CAPACITY 的值最小为 4 * TREEIFY_THRESHOLD
static final int MIN_TREEIFY_CAPACITY = 64;

什么时候对HashMap进行扩容呢

当向HashMap中插入数据导致里面的数据元素个数超过容量阈值了就马上进行扩容。例如:
a. HashMap的capacity属性值是100, loadFactor属性值是0.75,则它的Threshold是100 * 0.75 = 75
b. 如果此时HashMap中的数据元素个数是75,则再执行put函数后,会有size++,即元素个数增加1
c. 增加后发现实际存储的元素个数超过了75,则马上进行扩容,容量扩大为2倍

上一篇下一篇

猜你喜欢

热点阅读