版本:JDK1.8。html
这里把数组每一个元素称为桶
数组
- 使用数组+链表+红黑树:使用红黑树为了解决链表过长致使性能降低的问题。链表大于8就会转为红黑树
- JDK1.8后,hashmap使用尾插法。新增的元素会放在
bucket
(桶)的最后面。
- 为了解决头插入法在多线程下可能出现环链表的问题。同时链表内元素顺序保持不变
- 使用2的倍数做为数组的大小:更加容易计算他们所在的桶
若是是2的倍数的话,更容易计算所在的桶。好比原来是4,扩展为8多线程
-
在原来桶0的元素,会在新的桶0和4中源码分析
-
在原来桶1的元素,会在新的桶1和5中性能
-
在原来桶2的元素,会在新的桶2和6中.net
-
在原来桶3的元素,会在新的桶3和7中线程
为何会这样呢?首先须要是将hash
值取余获得所在桶。code
原来通长度是4,取余则是二进制后两位。好比在桶0,后两位必然是00
,桶1则是01
,桶2则是10
,桶3则是11
。对于长度为8,则是3位,原来桶0的00
将有两种可能:000
和100
也就是桶0和桶4(原来桶位置 + 原来桶长度 = 0 + 4)。htm
参考:blog
-
关于JDK1.8 HashMap扩容部分源码分析 :在resize扩容为何会出现环链表