在哈希图中,将新元素添加到存储桶的内部链表中总是在最后。为什么?

dgu*_*091 9 java collections concurrency linked-list hashmap

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

链接列表花费的时间:

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

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


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

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

T2-从地图读取新对象,再次在哈希图中已经存在哈希码。

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

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

Ami*_*era 21

因为当哈希码相同时,您不能只添加元素。当哈希码相同时,它必须检查equals每个链接列表节点中的键。因此,它需要遍历整个链表,以检查是否存在相等的密钥。