我害怕被批评。 无论如何,就像ArrayList会有连续的内存分配一样,LinkedList会有随机的内存分配,那么HashMap如何占用内存? 它是否也会在内存中占用随机块? 能否通过内存图形简要介绍Map的桶和其中的LinkedLists在内存中的位置?
我希望这不是一个胡说八道的问题。 没有找到关于Map内存分配图的太多信息。
编辑: 我提出的问题与调试/分析无关。 这只是关于HashMap如何适应内存的问题。 我之前表述得不清楚。
我害怕被批评。 无论如何,就像ArrayList会有连续的内存分配一样,LinkedList会有随机的内存分配,那么HashMap如何占用内存? 它是否也会在内存中占用随机块? 能否通过内存图形简要介绍Map的桶和其中的LinkedLists在内存中的位置?
我希望这不是一个胡说八道的问题。 没有找到关于Map内存分配图的太多信息。
编辑: 我提出的问题与调试/分析无关。 这只是关于HashMap如何适应内存的问题。 我之前表述得不清楚。
这是两者的结合。
HashMap
的背后有一个基础的、连续的数组。该数组的元素实际上是单向链表。每当向映射中添加一个键值对时,就会对相应槽位(即与该键的哈希值相对应的槽位)添加一个链表条目。
例如,将 k
映射到 v
的映射可能如下所示:
0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ | | | | | | | | | +-X-+-X-+-↓-+-X-+-X-+-X-+-X-+-X-+ ↓ ↓ +---+ | k | | - | | v | +---+
有一个长的“表”支持这个映射,以及一个支持特定的 k
-to-v
对的条目。
最好你自己看一下HashMap
源代码。
哈希表始终是一个数组,其中哈希码可以确定以获取数组元素的索引(在JDK中,这是条目)。因此,它也应该占用连续的内存。