java - HashMap 是如何占用内存的?

标签 java memory hashmap

我害怕投反对票。无论如何,就像 ArrayList 会有连续的内存分配一样,LinkedList 会有随机的内存分配,HashMap 是如何占用内存的呢?它是否也需要内存中的随机 block ?能否简要介绍一下map的bucket和里面的LinkedLists在内存中是如何定位的内存图?

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

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

最佳答案

这是两者的结合。

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

例如,将 k 映射到 v 的映射可能如下所示:

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

有一个支持 map 的长“表”,以及一个支持特定 k-to-v 配对的条目。

您最好看看HashMap source为自己。

关于java - HashMap 是如何占用内存的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23418879/

相关文章:

java - 如何以编程方式配置 TransactionManager

java - 为什么当我按下 enter 时我的程序不会停止

memory - 从unity3d中的url异步获取图像

php - 在 PHP 中运行密集的批处理,并避免内存耗尽

c++ - 2d(3d) 坐标的 HashMap (即 double vector )?

java - Java HashMap 中双倍作为键的问题

java - 使用 java8 流的规范列表组合

java - Android 版 OpenCV - Mat.get(row, col, double[])

php - 从 PHP 中的文件处理程序释放内存

java - 迭代值时的 HashMap 线程安全