HashMap是使用LinkedList还是Array在Java内部实现的?

2022-09-02 23:37:35

内部是如何实施的?我在某处读到它使用,而其他地方它提到数组。HashMapLinkedList

我尝试研究代码并找到了数组。那么在哪里使用呢?HashSetEntryLinkedList


答案 1

它基本上看起来像这样:

 this is the main array
   ↓
[Entry] → Entry → Entry      ← here is the linked-list
[Entry]
[Entry] → Entry
[Entry]
[null ]
[null ]

所以你有一个主数组,其中每个索引对应于某个哈希值('ed*到数组的大小)。mod

然后,它们中的每一个都将指向具有相同哈希值的下一个条目(再次为“ed*”)。这就是链表的用武之地。mod

*:作为技术说明,在被“ed”之前,它首先使用不同的函数进行哈希处理,但是,作为基本实现,只需模组即可工作。mod


答案 2

每个都有一个数组,在该数组中,它根据其键的哈希代码(例如)将每个数组放置在一个位置。存储 的位置称为存储桶HashMapEntryint position = entry.getKey().hashCode() % array.lengthEntry

如果多个条目最终位于同一存储桶中,则这些条目将合并到一个中(另请参阅@Dukeling的答案)。因此,桶比喻:每个数组索引都是一个“桶”,您可以在其中转储所有匹配的键。EntryLinkedList

您必须对存储桶使用 Array,才能实现随机访问所需的恒定时间性能。在存储桶中,您必须遍历所有元素才能找到所需的键,因此您可以使用,因为它更容易追加(无需调整大小)。LinkedList

这也表明了需要一个好的哈希函数,因为如果所有键都散列到只有几个值,你会得到很长的搜索和很多(快速访问)空桶。LinkedList