hashmap为什么在链表长度大于8,且数组长度大于64时将链表转换为红黑树

这个问题分两步分析:

1、为什么是链表长度大于8时

看一下源码解释

就是官方做过很多测试,发现链表长度在大于8以后再出现hash碰撞的可能性几乎为0,虽然转化为红黑树后,查找的效率会比链表高,但是转化红黑树这个过程是耗时的,而且在扩容时还要对红黑树重新的左旋右旋保持平衡,相对耗时,所以,阈值设置为8就是为了尽量减少hashmap中出现红黑树(hashmap中链表才是常态) 

2、为什么数组长度大于64时

同样,先看一下源码怎么解释的

其实这个源码中解释的不清不楚,里边说最小应该为4*8的倍数(TREEIFY_THRESHOLD=8)以减少碰撞,那这个也可以是32呀。

可能没有什么实际根据,不像上边的阈值8一样,是经过实际测试过的。这里只是猜测,也有可能是根据操作系统有关:64位的操作系统的最大内存寻址空间为2的64次方,数组长度小于64时,64位的操作系统也完全能够应对,这时候进行扩容要比转化红黑树效率高的多;相反,如果数组过长,进行一次扩容要迁移的数据更多,会比转化红黑树效率低。(这里只是猜测,后续如有新的证明会及时更新)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值