非攻喵 2018-12-19 16:13 采纳率: 100%
浏览 832
已采纳

jdk1.8中HashMap源码有一些疑问.

在Node链表长度超过7的时候会执行treeifyBin方法进行树的转换.
但是在treeifyBin方法里又判断了tab(也就是放Node链表的数组)的长度不超过64时, 仅执行resize

我想问的是, 链表的长度和tab的length有毛关系?
为什么链表超长了,需要resize tab?


以下为部分源码

// bincount 就是链表的长度.  TREEIFY_THRESHOLD默认为8
if (binCount >= TREEIFY_THRESHOLD - 1)
    treeifyBin(tab, hash);

// MIN_TREEIFY_CAPACITY 默认为64
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
    resize();

  • 写回答

3条回答 默认 最新

  • 阿进的写字台 2018-12-19 11:36
    关注

    仅仅是因为设计的人觉得长度小于64时没必要进行树的转换。。先进行resize(), resize() 之后,可能就达不到转化为树的要求啦。。。

    要理解这个, 你需要知道他是怎么计算tab中位置的,

    index = (table.length - 1) & hash
    

    以上会涉及到tab长度需要是2的次幂。。 不过在此你可以认为是取模, 虽然不太一样。

    所以, table的长度增加之后, index是有可能会变化的:比如hash值是1和9的两个值, 在长度为8的table上都是在第一个索引中的, 但是,如果长度扩为16, 则他们就不在一个索引中了。

    如不理解, 可以看我的文章

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题