淹不死的水 2017-09-19 01:45 采纳率: 0%
浏览 2387
已结题

HashMap插入时存在避免尾部遍历之说?

HashMap插入元素的过程:
1 首先计算key的hash值,然后根据table的长度进行取模,找到自己的index位置。
2 如果table[index]位置上没有其他元素,则直接插入,否则就发生了hash冲突。
hashmap解决hash冲突是采用链地址法,也就是说,当发生hash冲突后,会
遍历链表中每个元素,调用equals方法进行比较,如果相等则将旧的value替换为新的 value,如果遍历结束后,都没有相等的,则在链表头部插入。

问题来了,为什么要在链表头部插入呢?网上说是避免尾部遍历。。但是真的存在避免尾部遍历么?因为在插入元素时,会调用equals方法和每个元素进行比较,少不了遍历的过程,完全可以在遍历结束后在尾部进行插入,并不会多出额外的时间复杂度。

求大神解答啊。。谢谢啦

  • 写回答

4条回答

  • 珠穆朗玛小王子 博客专家认证 2017-09-19 02:37
    关注

    首先HashMap在解决hashcode相同的时候,选择了头部插入的链式结构,我觉得主要是为了提高效率:

    1、你后插入的相同hashcode的对象,从理论上说,应该是最近要使用的概率最高,所以插入头部位置。就好像某些软件的最近使用列表,一定是按照你最近打开的顺序排序的,那么你一定会去打开最近使用的吗?不一定,只是从感性上推断最近使用的那个打开的效率最高,例如从我工作的情况来看,重复打开同一个Work文档的概率非常高。

    2、我记得源码里,并没有提供尾部遍历的方法,都是通过next指向下一个对象,并且你也说了头部和尾部的遍历效率几乎是一样的,所以我觉得避免尾部遍历的说法有点说不过去。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料