V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
DengDDDD
V2EX  ›  Java

HashMap 在 jdk 1.7 中为什么选的头插法,而不是尾插法

  •  
  •   DengDDDD · Jan 12, 2021 · 4034 views
    This topic created in 1936 days ago, the information mentioned may be changed or developed.

    在我看来,头插法和尾插法都要遍历一遍链表啊,应该不是效率问题吧.

    12 replies    2021-01-15 14:53:19 +08:00
    VincentWang
        1
    VincentWang  
       Jan 12, 2021
    有一种说法是:缓存的时间局部性原则 (新插入的数据可能会更早用到)
    DengDDDD
        2
    DengDDDD  
    OP
       Jan 12, 2021   ❤️ 1
    我刚看了遍源码,得出一个结论,感觉还挺像的
    插入时需要判断是否重复,此时要遍历一遍链表,
    如果采用尾插法,需要将尾节点保存起来,传入后面的 addEntry 的方法中
    addEntry 会判断是否需要扩容,如果扩容的话,待插入节点的下标就需要重新计算,
    这样之前保存的尾节点就不一定正确,需要在重新计算一次尾节点,
    所以说使用头插法效率会高一些
    DengDDDD
        3
    DengDDDD  
    OP
       Jan 12, 2021
    @VincentWang 刚刚不知道如何回复。
    qwerthhusn
        4
    qwerthhusn  
       Jan 12, 2021
    插头插尾都无所谓,因为链表长度达到 8 (好像是 6,忘记了)的时候,就变成红黑树了,
    长度个位数的链表,咋遍历都不会影响性能
    kx5d62Jn1J9MjoXP
        5
    kx5d62Jn1J9MjoXP  
       Jan 12, 2021 via Android
    因为简单啊,怎么简单怎么来呗
    emSaVya
        6
    emSaVya  
       Jan 12, 2021
    头插有概率形成死循环 1.8 以后改成尾插
    cco
        7
    cco  
       Jan 13, 2021
    @qwerthhusn 这不是 1.8 后才有的么?
    DengDDDD
        8
    DengDDDD  
    OP
       Jan 13, 2021
    @qwerthhusn,在 1.8 之后确实不用考虑这个问题了,但是我当时奇怪的是 1.7 为什么用的头插法。
    @emSaVya 对,就是因为头插法会形成环形链表,所以我才好奇为什么不用尾插法,当时我以为效率一样,后面发现其实是不一样的。
    ffhigh
        9
    ffhigh  
       Jan 13, 2021
    如果 1.7 只改尾插, 不改扩容机制。 也不会形成环么?
    qifeng7
        10
    qifeng7  
       Jan 15, 2021
    可能是在扩容迁移元素的过程中,用头插法更快
    qifeng7
        11
    qifeng7  
       Jan 15, 2021
    1.7 是一个元素一个元素迁移的,用尾插法就要遍历到链表尾部再插入
    qifeng7
        12
    qifeng7  
       Jan 15, 2021
    扩容转移元素不需要遍历一遍链表哦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1273 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 16:59 · PVG 00:59 · LAX 09:59 · JFK 12:59
    ♥ Do have faith in what you're doing.