哈希映射如何占用内存?

2022-09-02 13:57:14

我害怕投反对票。无论如何,就像ArrayList有一个连续的内存分配,一个LinkedList会有一个随机的内存分配,HashMap如何占用内存?它是否也会在内存中占用随机块?我能否简要介绍一下映射的存储桶和内部的LinkedLists在内存中的位置的内存图?

我希望这不是一个bs问题。没有找到太多关于Map的内存分配图的信息。

编辑:我提出的问题与调试/分析无关。这只是关于HashMap如何适应内存。我不清楚。


答案 1

这是两者的结合。

有一个底层的连续数组支持 。此数组的元素实际上是单链表。每次向映射添加键值对时,都会对键进行哈希处理,并将链接列表条目添加到后备数组的相应槽(即与键的哈希值对应的槽)中。HashMap

例如,映射到的地图可能如下所示:kv

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |
+-X-+-X-+-↓-+-X-+-X-+-X-+-X-+-X-+
          ↓
          ↓
        +---+
        | k |
        | - |
        | v |
        +---+

有一个支持地图的长“表”,以及一个支持特定配对的条目。kv

您最好自己查看HashMap源代码


答案 2

哈希映射始终是一个数组,其中可以确定哈希码以获取数组元素的索引(在jdk中,这是条目)。因此,它也应该需要连续的记忆。