HashMap实现原理:容量、负载因子、hash与定位都搞定了吗?( 六 )
将旧entry的引用赋值给新entry的next属性 , 改将新entry放在该位置——即在该位置上存储一个链表 , 冲突节点从链表头部插入 , 这样插入新entry时不需要遍历链表 , 时间复杂度为O(1) 。 但如果链表过长 , 查询性能仍将退化到O(n) 。 Java8中对链表长度增加了一个阈值 , 超过阈值链表将转化为红黑树 , 查询时间复杂度降为O(logn) , 提高了链表过长时的性能 。
勘误:网上有朋友联系我指出了此处的错误 , Java8中 , 发生碰撞时会遍历到链表的最后 。
这篇文章写的时候读源码能力比较渣 , 就基于自己早期对Java7源码的分析改编 , 本以为除了红黑树部分 , 大体相同 , 就直接copy了过来 , 导致了这个错误——当然 , 现在想来 , 关于Java7中HashMap的分析也是错的 , 最后插入方式没错 , 但是插入前还是要O(n)的时间遍历一遍 。 不过其他涉及源码的文章就都是老老实实追源码写出来的 , 可以放心阅读 。 告诫自己 , 要坚持踏实 , 坚持怀疑 。 以下是改正的分析 。
从该位置上的entry开始 , 遍历到找到相同的key(就替换) , 或到结尾还是没有相同的key(就衔接在尾节点的next上) 。 查询时过程相同 。 不考虑任何优化 , 插入、查询的性能都是O(n) 。 Java8中对链表长度增加了一个阈值 , 超过阈值链表将转化为红黑树 , 插入、查询的时间复杂度降为O(logn) , 提高了链表过长时的性能 。 调用get方法时 , 定位到该位置 , 再遍历红黑树 , 比较key值找到所需元素:
推荐阅读
- 左慈|三国杀:技能缝接,超强发挥,用左慈就能实现
- 商人|游戏商人的月入百万是真的吗?揭秘真实的剑三游戏商人真实现状
- fly|从电竞迈向艺术:Fly选手实现人生跨越,成历史第一人!
- 赤色要塞|玩经典游戏《赤色要塞》魔改版:吉普车也能用激光炮,童年梦想实现了
- 手机游戏|梦幻西游手游:封系统治擂台?浅谈经脉学问,方寸也能实现双封!
- 魂斗罗|“为什么魂斗罗内存这么少,却可以实现那么长的剧情?”
- rw战队|KPL前瞻:Hero对阵RW侠首发公布,黑鲸的Flag真有可能实现
- 单机|《仙剑奇侠传七》逆风翻盘!蒙尘的老牌IP,终于实现了自我救赎
- LGD|Ti10:LGD实现逆天翻盘锁定总决赛,虎牙Sccc激动到泪目
- 美好世界|“我们的工作只是实现人类的愿望,而不是创造一个我们认为的《美好世界》”