jdk7中HashMap的扩容机制
-
必须同时满足以下两个条件
添加新节点时当前已存放的节点数量必须大于等于当前阈值。
本次添加节点时发生了hash冲突:(当前key计算的hash值换算出来的数组下标位置已经存在值)。
分析
-
在触发第一次扩容之前存放的最大数量
pre_condition:默认大小为16,负载因子0.75,阈值12。
-
case_1:
存满 16个节点时,再存入第17个节点才会发生扩容现象,因为前16个节点,每个值在底层数组中分别占据一 个位置,虽然大于等于阈值,但没有发生hash碰撞。
如图所示:(图中数字仅代表节点添加顺序)
-
case_2
前11个节点,存到数组的同一个位置(这时元素个数小于阈值12,不会扩容)。
如图所示:(图中数字仅代表节点添加顺序)
后面所有存入的15 个值全部分散到数组剩下的15个位置(虽然这个过程元素个数大于等于阈值,但是每次存入的元素与已存在的元素并没有发生hash碰撞,所以不会扩容)。
如图所示:(图中数字仅代表节点添加顺序)
总结
11+15=26,所以在存入第27个值的时候才同时满足上面两个条件,才会发生扩容现象。
在第一次扩容之前最多能存放26个节点