【发布时间】:2009-02-10 14:25:10
【问题描述】:
哪种类型的数据结构使用更多的内存?
- 哈希表
- 哈希图
- 数组列表
能否请您简要解释一下哪个更不容易发生内存泄漏?
【问题讨论】:
-
好的,我想我们现在要删除所有的 cmets?
标签: java data-structures memory-management
哪种类型的数据结构使用更多的内存?
能否请您简要解释一下哪个更不容易发生内存泄漏?
【问题讨论】:
标签: java data-structures memory-management
...使用哪一个来避免内存泄漏
答案是全部,而没有。
内存泄漏与数据结构无关,而与你使用它们的方式有关。
当您旨在避免“内存泄漏”时,每个人使用的内存量无关紧要。
您能做的最好的事情是:当您在应用程序中检测到一个将不再使用的对象时,您必须将其从集合中删除(而不是仅列出您列出的那些,但您可能使用的任何其他;List、Map、Set 甚至是数组)。
这样垃圾收集器将能够释放该对象使用的内存。
您可以查看这篇文章"How does garbage collector works",进一步了解 Java 如何从它使用的对象中释放内存。
编辑:
Java 中还有其他数据结构有助于引用管理,例如WeakHashMap,但这可能被视为“高级主题”。
【讨论】:
您很可能应该只使用适合您当前需求的集合。在最常见的情况下,如果您需要List,请使用ArrayList,如果您需要Map,请使用HashMap。有关教程,请参见例如http://java.sun.com/docs/books/tutorial/collections/
当您的分析器显示存在与使用 Java 集合相关的实际内存泄漏时,然后对此采取一些措施。
【讨论】:
可悲的是,您的问题未充分说明,因为您指定的具体数据结构不是具有可比性的结构。
HashMap/HashTable 具有可比性,因为它们都用作映射(键 -> 值查找)。 ArrayLists(和一般的列表)没有。
HashMap/HashTable 部分很容易回答,因为它们在很大程度上是相同的(主要区别是空键),但前者不同步,后者是,因此 HashMap 通常会更快(假设不需要同步)现代 JVM 在非竞争锁方面相当快,因此在微基准测试中差异会很小。
【讨论】:
嗯,实际上,我最近一直处于必须持有大量自定义对象的情况,其中集合的大小是应用程序的限制因素之一。如果这是您的情况,请提出一些建议 -
最终,最简单的事情就是自己测试。
【讨论】:
您没有将同类与同类进行比较:HashMap 和 Hashtable 实现了 Map 接口,ArrayList 实现了 List 接口。
在Hashtable 和HashMap 之间的直接比较中,HashMap 可能会提供更好的性能,因为Hashtable 是同步的。
如果您说明您将这些集合用于什么目的,您可能会得到更有洞察力的答案。
【讨论】:
Hashtables(无论是 HashMap 还是 HashTable)会比它们用于实际存储信息的内存占用更多的内存。
哈希性能是有代价的。
【讨论】:
java.util.Collection 存储对对象的引用。
java.util.Map 存储对 Map.Entry 实例的引用,其中包含对键和对象的引用。
因此,持有 N 个对象引用的 java.util.Collection 将比持有相同 N 个引用的 java.util.Map 需要更少的内存,因为 Map 也必须指向键。
读写性能因这些接口的实现而异。
我没有看到任何类似于 WeakHashMap 的 java.util.Collection。如果您担心垃圾收集和内存泄漏,我会阅读该课程。
【讨论】:
正如其他人所指出的,您的问题未详细说明。
不过,有时基于 ArrayList 的实现可以替换基于 HashMap 的实现(我根本不会考虑 Hashtable,它已经过时了)。您可能需要线性搜索 ArrayList,但对于可能仍然足够快的小型列表,并且 ArrayList 将需要更少的内存(对于相同的数据),因为它的开销更少。
【讨论】:
在大多数语言中,这取决于你用完玩具后捡起玩具的能力。
在 Java 中,这无关紧要,因为垃圾收集是自动完成的,您不必担心内存泄漏。
【讨论】: