gpt4 book ai didi

java - 集合中的内存消耗

转载 作者:行者123 更新时间:2023-11-30 06:05:09 24 4
gpt4 key购买 nike

您好,最近在一次面试中,有人问我有一个 Hashmap、一个 ArrayList 和一个 Hashset。它们每个都包含相同的 10 个用户定义对象(例如:Employee 类对象)。哪个会占用更多堆空间,为什么?

我给出的答案是 Hashmap,因为它存储了两个键值对。但是 Hashset 也在内部使用 hashmap 来存储值。

  1. 有人能给出有理有据的答案吗。
  2. 有什么工具或 eclipse 插件可以让我自己检查吗?

谢谢。

最佳答案

如果您同时计算容器所需的内存和“10 个用户定义的对象”所需的内存,那么您是正确的。

HashMap 会占用更多空间。

尽管 HashSetHashMap 支持,但它存储在所有条目中的值是对同一虚拟实例的引用。

因此,HashSet 需要 10 个键引用 + 10 个值引用 + 10 个元素 + 1 个虚拟实例。

另一方面,HashMap 需要 10 个键引用 + 10 个值引用 + 10 个键实例 + 10 个值实例(假设“10 个用户定义的对象”存储为值)。

当然,为了更准确,您还必须计算保存 HashMap 桶的数组的大小,但这在 HashMap 中是相同的和 HashSet,因为它们包含相同数量的元素。

请注意,正如 JB Nizet 评论的那样,如果 HashMap 的键是“10 个用户定义对象”的属性,则“10 个键实例”不需要额外的内存(因为它们已经存在),因此 HashMapHashSet 都需要相同数量的内存来存储 10 个对象,而 HashSet 实际上需要一个更多的内存,因为它包含对 HashMap 的引用。

ArrayList 应该比 HashSetHashMap 占用更少的内存,因为 ArrayList 的后备数组> 的默认初始长度为 10(足以存储 10 个对象),而 HashMap 的桶数组的默认初始长度为 16(也足以存储 10 个对象,假设我们使用默认负载系数 0.75)。

关于java - 集合中的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47494924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com