哪种类型的数据结构使用更多内存?
请您简单解释哪一个不容易出现内存泄漏?
答案 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)
好吧,最近我确实遇到过这样一种情况:我必须抓住大量的自定义对象,其中集合的大小是应用程序限制因素之一。如果这是你的情况,一些建议 -
最终,最简单的方法就是自己测试。
答案 4 :(得分:0)
您没有像以下那样进行比较:HashMap
和Hashtable
实现Map
接口,ArrayList
实现List
接口。
在Hashtable
和HashMap
之间进行直接比较时,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中,无关紧要,因为垃圾收集是自动完成的,而您实际上并不需要担心内存泄漏。