哪种数据结构使用更多内存?

时间:2009-02-10 14:25:11

标签: java data-structures memory-management

哪种类型的数据结构使用更多内存?

  • 哈希表
  • Hashmap
  • 的ArrayList

请您简单解释哪一个不容易出现内存泄漏?

9 个答案:

答案 0 :(得分:15)

  

...用于避免内存泄漏的

答案是全部

内存泄漏与数据结构无关,而是与您使用它们的方式有关。

当您的目标是避免“内存泄漏”时,每个内存使用的内存量无关紧要。

您可以做的最好的事情是:当您在应用程序中检测到将不再使用时,必须将其从集合中删除(不是只列出你列出的,但你可能使用的任何其他;列表,地图,设置甚至数组)。

这样垃圾收集器就能释放该对象使用的内存。

您可以查看本文"How does garbage collector works",以获得有关Java如何从其使用的对象中释放内存的进一步说明。

修改

Java中有其他数据结构可以帮助WeakHashMap等参考管理,但这可能被视为“高级主题”。

答案 1 :(得分:3)

您最有可能只使用适合您当前需求的Collection。在最常见的情况下,如果您需要List,请使用ArrayList,如果您需要Map,请使用HashMap。有关教程,请参阅例如http://java.sun.com/docs/books/tutorial/collections/

当您的探查器显示存在与使用Java Collections相关的实际内存泄漏时,然后会对其进行一些操作。

答案 2 :(得分:1)

您的问题严重不足,因为您指定的具体数据结构不具有可比性。

HashMap / HashTable具有可比性,因为它们都可以作为地图(键 - >值查找)。 ArrayLists(和一般的列表)没有。

HashMap / HashTable部分很容易回答,因为它们大致相同(主要区别是空键)但前者不同步而后者是,因此HashMap通常会更快(假设不需要同步)现代JVM在无竞争锁定方面相当快,但在微观基准测试中差异很小。

答案 3 :(得分:1)

好吧,最近我确实遇到过这样一种情况:我必须抓住大量的自定义对象,其中集合的大小是应用程序限制因素之一。如果这是你的情况,一些建议 -

  • 有一些实现 使用基元的集合(列表 here)。玩了一下 trove4j,发现有点小 记忆足迹(只要你是 当然,处理原语。
  • 如果你正在处理大事 收藏品,你可能会得到更多 就你而言,砰的一声 通过减少内存占用 优化您的对象 保持。毕竟,你有很多 更多,否则你不会 需要一个集合,对吗?
  • 有些集合自然较小(例如LinkedList会比ArrayList小一点),但差异可能会被它们的使用方式差异所淹没。
  • 大多数java集合都可以手动调整大小 - 您可以将100个元素的arraylist设置为初始化为100个元素,并且可以设置地图以减少开放空间,但代价是性能降低。全部在javadocs。

最终,最简单的方法就是自己测试。

答案 4 :(得分:0)

您没有像以下那样进行比较:HashMapHashtable实现Map接口,ArrayList实现List接口。

HashtableHashMap之间进行直接比较时,HashMap可能会提供更好的效果,因为Hashtable已同步。

如果你给出了一些关于你正在使用这些馆藏的指示,你可能会得到一个更有见地的答案。

答案 5 :(得分:0)

Hashtables(无论是HashMap还是HashTable)会占用比实际存储信息更多的内存。

哈希表现是有代价的。

答案 6 :(得分:0)

java.util.Collection存储对象的引用。

java.util.Map存储对Map.Entry实例的引用,这些实例保存对键和对象的引用。

因此,持有对对象的N个引用的java.util.Collection将比保存在相同N个引用上的java.util.Map需要更少的内存,因为Map也必须指向键。

读取和写入的性能取决于每个接口的实现。

我没有看到任何类似于WeakHashMap的java.util.Collection。如果你担心垃圾收集和内存泄漏,我会读到这个类。

答案 7 :(得分:0)

正如其他人所指出的那样,你的问题是不明确的。

尽管如此,有时基于ArrayList的实现可以取代基于HashMap的实现(我根本不会考虑Hashtable,它已经过时了)。您可能需要线性搜索ArrayList,但是对于可能仍然足够快的小列表而且ArrayList将需要更少的内存(对于相同的数据),因为它具有更少的开销。

答案 8 :(得分:-2)

在大多数语言中,这取决于你完成玩具后拾取玩具的好处。

在Java中,无关紧要,因为垃圾收集是自动完成的,而您实际上并不需要担心内存泄漏。