JDK1.8之前
new HashMap(n)
中的n
为其容量- 元素插入使用头插法
- 并发插入(resize时)会产生循环链表,在
get
一个不存在的元素时会导致死循环。参考:Java HashMap的死循环
JDK1.8之后
- 元素使用尾插法
new HashMap(n)
中的n
最接近的2^m为其容量- 并发插入还是有问题,但不会产生死循环
- 插入时数组长度>64,桶元素>8时,会树型化
- 发生resize时,resize后,桶元素个数<=6的,都会被解树型化
- 取模用与操作
(hash & (arrayLength-1))
会比较快,所以数组的大小永远是2的N次方。你随便给一个初始值比如17会转为32 - resize实现逻辑参考:Java HashMap工作原理及实现