前言
大家好, 这里是Yve菌, 今天给大家总结一下HashMap在jdk1.7和1.8的区别
HashMap在jdk1.7和1.8中的区别
1. 结构不同
首先HashMap在1.7中是以数组+链表的形式存在的, 如图所示:
而HashMap在1.8中则是以数组+链表+红黑树构成的, 当一个节点的链表长度超过8并且数组长度超过64时会将链表转换为红黑树, 如图:
2. 扩容条件不同
在1.7中进行初始化或内部当size超过阈值时会触发扩容, 扩容之后的数组大小为之前的两倍, 并且之前该下标的元素只会继续保存在该下标或者两倍的下标位置.
在1.8中扩容触发条件有两个
- 当初始化或size超过阈值时会触发扩容
- 一条链表上节点数量超过8时会调用treeifyBin()方法, 方法内部如果数组长度小于64则会触发resize()扩容方法
3. put插入方式不同
在1.7中, hashmap调用put()方法插入时时采用的是头插法, 并且因为hashmap不是线程安全的, 所以当并发插入并触发扩容时可能会把数组内部的链表变成循环链表, 造成死循环的问题
在1.8中, hashmap的put()方法改为了尾插法插入, 因此解决了1.7中并发扩容造成的循环链表问题, 但是实际上在往红黑树内部并发插入时也有可能会造成两个父节点相互引用而导致的死循环问题
4. 扩容时间不同
在1.7中, hashmap会先检测是否需要扩容之后再往里面放数据, 而在1.8中hashmap会先把数据放进去在检测是否需要扩容