-
HashMap在1.7中是由 数组+链表 也可以说 哈希表+链表 实现的
-
HashMap在1.8中是由 数组+链表 +红黑树
-
在JDK1.7中,HashMap存储的是Entry对象
在JDK1.8当中,HashMap存储的是实现Entry接口的Node对象
-
JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法
-
为什么从头插法改成尾插法?
在1.7中,是没有红黑树的 在并发的情况下单链表过长,会成环,发生死循环
在1.8中,尾插法就可以解决这个问题
-
-
扩容机制
-
在JDK1.7的时候是先扩容后插入的,扩容过程中会将原来的数据,放入到新的数组中,但是会重新计算hash值进行分配,这样就会导致无论这一次插入是不是发生hash冲突都需要进行扩容,如果这次插入的并没有发生Hash冲突的话,那么就会造成一次无效扩容,
但是在1.8的时候是先插入再扩容的,优点是可以减少1.7的一次无效的扩容,因为如果这次插入没有发生Hash冲突的话,那么其实就不会造成扩容
-