HashMap 1.7 与 1.8 的 区别,说明 1.8 做了

2018-12-25  本文已影响0人  Jeffery大侠

参考文献:https://blog.csdn.net/jek123456/article/details/73869203
https://blog.csdn.net/liyantianmin/article/details/79401854

JDK1.7中

使用一个Entry数组来存储数据,但是这个Entry是链表结构,如果插入的key的hashcode相同(hash collision),那么这些key会被定位到Entry数组的同一个格子里,这些key会形成一个链表。

在hashcode特别差的情况下,比方说所有key的hashcode都相同,这个链表可能会很长,那么put/get操作都可能需要遍历这个链表

也就是说时间复杂度退化到了O(n)的级别

JDK1.8中

使用一个Node数组来存储数据,但这个Node可能是链表结构,也可能是红黑树结构

如果插入的key的hashcode相同,那么这些key也会被定位到Node数组的同一个格子里。

如果同一个格子里的key不超过8个,使用链表结构存储。

如果超过了8个,那么会调用treeifyBin函数,将链表转换为红黑树。

那么即使hashcode完全相同,由于红黑树的特定,查找某个特定元素,也只需要O(log n)的开销

也就是说put/get的操作的时间复杂度只有O(log n)

上一篇 下一篇

猜你喜欢

热点阅读