【问题标题】:In a hashmap, the addition of a new element to the internal linked list of a bucket is always at the end. Why?在 hashmap 中,向桶的内部链表添加新元素总是在最后。为什么?
【发布时间】:2020-01-15 04:16:54
【问题描述】:

在 hashmap 中,当我们拥有相同的 hashcode 时,我们将对象作为链表插入,然后将其转换为 TreeNode。每个具有相同哈希码的 New 对象都被添加到附加的链表的最后一个。所以,我的问题是为什么不将新元素添加为附加到存储桶的内部链表的第一个元素?为什么要遍历到最后一个元素,然后添加新元素。

链表花费的时间:

在开始处插入新元素 = O(1)

在末尾插入新元素 = O(n)


一个可能的答案可能是,因为 hashmap 不是线程安全的,从单个位置并发读取和写入元素会导致异常。例如, 有两个事务:

T1 -- 将新对象添加到哈希图中已经存在哈希码的映射中。

T2 -- 从映射中读取新对象,哈希映射中已经存在哈希码。

当这两个事务同时发生时,我们开始将新元素添加到开头而不是最后一个位置,由于在第一个位置进行了更改,读取操作可能会受到影响。

如果有人对此有更好的见解,请发表评论。

【问题讨论】:

  • 那么您实际上指的是“哈希图”的哪个实现?能否请您发布一些sn-ps的代码...
  • @GyroGearless 在我看来,hashmap 的所有实现都有一个内部链表,除非达到特定阈值。如果我缺少任何实现,请告诉我。谢谢:)

标签: java collections concurrency linked-list hashmap


【解决方案1】:

因为你不能只在哈希码相同的情况下添加元素。当哈希码相同时,它必须在每个链表节点的键上检查equals。因此,它需要遍历整个链表以检查是否已经存在任何相等的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2013-08-20
    • 2013-04-24
    相关资源
    最近更新 更多