Ense 2021-03-25 12:28 采纳率: 50%
浏览 564
已采纳

关于hashmap在什么时候使用数组,什么时候使用链表/红黑树的问题

问题:

1.java8以后链表长度超过8会转为红黑树,当删除后长度效益8会转为链表。这个我知道,但是hashmap是使用Node[] table来存储node,那么问题就来了,什么情况下元素存储在table中,什么情况下转为链表存储。是不是发生了hash碰撞才会转为链表存储,但是一个hashmap发生hash碰撞的概率小之又小,这样利用率太低了,发生红黑树的转换我感觉几乎不可能存在(应为转为红黑树的前提是发生8次hash碰撞,除非恶意改写hashcode生成函数),那如果没有发生hash冲突,是不是都存储在数组中的?

2.当发生hash碰撞时,元素存储在链表中,通过key  get出来的value按理说会有多个啊,怎么取得出来。

3.hashmap的检索速度是o(1),怎么通过hashcode迅速定位到该node的

可以只回答其中一个问题,我主要是想弄明白第一个问题!

  • 写回答

1条回答 默认 最新

  • 三岁丫 2021-03-25 12:57
    关注

    第一个问题自己看源码吧,很久没看过我也忘了。通过 key 找到 value,算出 hashCode 只是第一步,也就是说要找到对应的 value 是需要多次判断的,如果通过 hashcode 找到 value 的时候,还会去直接比较 key 是否相等。一切的一切都是最好自己去看源码,根据你的疑惑点,找到对应的位置看,其实没有那么难,又不是看所有的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加