HashMap是使用LinkedList还是Array在Java内部实现的?
2022-09-02 23:37:35
内部是如何实施的?我在某处读到它使用,而其他地方它提到数组。HashMap
LinkedList
我尝试研究代码并找到了数组。那么在哪里使用呢?HashSet
Entry
LinkedList
内部是如何实施的?我在某处读到它使用,而其他地方它提到数组。HashMap
LinkedList
我尝试研究代码并找到了数组。那么在哪里使用呢?HashSet
Entry
LinkedList
它基本上看起来像这样:
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
每个都有一个数组,在该数组中,它根据其键的哈希代码(例如)将每个数组放置在一个位置。存储 的位置称为存储桶。HashMap
Entry
int position = entry.getKey().hashCode() % array.length
Entry
如果多个条目最终位于同一存储桶中,则这些条目将合并到一个中(另请参阅@Dukeling的答案)。因此,桶比喻:每个数组索引都是一个“桶”,您可以在其中转储所有匹配的键。Entry
LinkedList
您必须对存储桶使用 Array,才能实现随机访问所需的恒定时间性能。在存储桶中,您必须遍历所有元素才能找到所需的键,因此您可以使用,因为它更容易追加(无需调整大小)。LinkedList
这也表明了需要一个好的哈希函数,因为如果所有键都散列到只有几个值,你会得到很长的搜索和很多(快速访问)空桶。LinkedList