Java1.8之HashMap底层链表变红黑树浅析

HashMap底层链表变红黑树浅析

全文浏览约10分钟,从一个错误的结论分析到HashMap链表转化为红黑树的原因。读完对HashMap底层会有更深的理解。

广为流传的错误结论

  • 众所周知,Java1.8以后HashMap链表长度大于8数组长度大于64时,链表变为红黑树。

  • 网络上有一种错误说法流传甚广,请看分析:

      - 链表查找的时间复杂度:分为头查找和尾查找,综合两种查找,时间复杂度是n/2
      - 红黑树查找的时间复杂度:log2n
      
      - 分析:当长度为8时,链表查找时间为:8/2 = 4,红黑树查找时间为:log8 = 3
        	 当长度为7时,链表查找时间为:7/2 = 3.5,红黑树查找时间为:log7 = 2.8
      - 结论:长度为8时红黑树明显快于链表
    
  • 以上是错误结论,没有弄清楚大O表示法的意义所在。

大O表示法

  • 大O表示法(时间复杂度):

     大O表示法 是一种特殊的表示法,指出了算法的速度有多快。
     谁在乎呢?实际上,你经常要使用别人编写的算法,在这种情况下,知道这些 算法的速度大有裨益。
    

    简单来说大O表示法用于数据量巨大时所需要的时间消耗。注意!!在数据量过低时,大O表示法没有意义!!!

大O表示法

真正的原因

请看HashMap源码
HashMap源码

  • HashMap源码里的一段注释,大概是说,Hash函数算出HashCode导致冲突的概率符合泊松分布。
  • 个人理解:当链表长度等于8时已经是非常小的小概率事件(0.00000006),而红黑树的维护本就有时间成本,所以为了效率当很不可能出现时(数据量很大时),才转化为红黑树,避免频繁维护红黑树、红黑树变为链表出现的消耗。

本文引用:
Java1.8 Hash、《算法图解》

不忘初心,技术改变世界

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值