非攻喵 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 有卷积神经网络识别害虫的项目吗
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件