- HashMap 的存储机制
- 在 Java 1.8 中,如果链表的长度
超过了 8
,那么链表将转化为红黑树
;链表长度低于6,就把红黑树转回链表;
- 在 Java 1.8 中,如果链表的长度
- Java 1.8 中 HashMap 的不同
- 在 Java 1.8 中,如果链表的长度
超过了 8
,那么链表将转化为红黑树
;链表长度低于6,就把红黑树转回链表; - 发生 hash 碰撞时,Java 1.7 会在链表头部插入,而 Java 1.8 会在链表尾部插入;
- 在 Java 1.8 中,Entry 被 Node 代替(换了一个马甲)。
- 在 Java 1.8 中,如果链表的长度
- put过程
- 对Key求Hash值,然后再计算下标
- 如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中)
- 如果碰撞了,以链表的方式链接到后面
- 如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
- 如果节点已经存在就替换旧值
- 如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)
- get过程
- 当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置
- 找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点
- 最终找到要找的值对象