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

Java 哪个数据结构使用更多内存?,java,data-structures,memory-management,Java,Data Structures,Memory Management,哪种类型的数据结构使用更多内存 哈希表 哈希映射 ArrayList 你能给我一个简短的解释吗?哪一个比较不容易出现内存泄漏?在大多数语言中,这取决于你处理完玩具后,你拾起它们的能力有多强 在Java中,这并不重要,因为垃圾收集是自动完成的,您实际上不需要担心内存泄漏 您没有将like与like进行比较:HashMap和Hashtable实现映射接口,而ArrayList实现列表接口 在Hashtable和HashMap之间的直接比较中,HashMap可能会提供更好的性能,因为Hashtable

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

哈希表 哈希映射 ArrayList
你能给我一个简短的解释吗?哪一个比较不容易出现内存泄漏?

在大多数语言中,这取决于你处理完玩具后,你拾起它们的能力有多强


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

您没有将like与like进行比较:HashMap和Hashtable实现映射接口,而ArrayList实现列表接口

在Hashtable和HashMap之间的直接比较中,HashMap可能会提供更好的性能,因为Hashtable是同步的

如果您给出一些关于使用这些集合的指示,您可能会得到一个更深刻的答案

…要使用哪一个来避免内存泄漏

答案是所有的,但没有一个

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

当您试图避免内存泄漏时,每个人使用的内存量是不相关的

您可以做的最好的事情是:当您检测到一个对象不再在应用程序中使用时,您必须将其从集合中删除,不仅是您列出的对象,而且是您可能使用的任何其他对象;列表、映射、设置甚至数组

这样,垃圾收集器将能够释放该对象使用的内存

您可以阅读本文,进一步了解Java如何从其使用的对象中释放内存

编辑:


Java中还有其他一些数据结构有助于引用管理,例如,但这可能被视为高级主题。

最有可能的是,您应该使用适合当前需要的集合。在最常见的情况下,如果需要列表,请使用ArrayList;如果需要映射,请使用HashMap。有关教程,请参见例如


当您的探查器显示与Java集合的使用相关的实际内存泄漏时,请对此采取措施。

您的问题没有明确说明,因为您指定的具体数据结构没有可比的结构

HashMap/HashTable具有可比性,因为它们都起到映射键->值查找的作用。 ArrayList和List通常不会


HashMap/HashTable部分很容易回答,因为它们基本相同。主要区别是空键,但前者不同步,后者是,因此,假设不需要同步,HashMap通常会更快。现代JVM在无争用锁上的速度相当快,尽管如此,在微基准测试中差异会很小。

Hashtables无论是HashMap还是HashTable都会比它们实际存储信息所用的内存稍多一些


哈希性能是有代价的。

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

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

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

读写性能因每个接口的实现而异


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

最近,我实际上遇到了一种情况,我不得不保留大量自定义对象的集合,其中集合的大小是应用程序的限制因素之一。如果这是你的情况,一些建议-

有几个实现 使用基元列表的集合 . 玩了一会儿 trove4j,并发现了一个较小的 只要你是 当然,处理原语。 如果你在和大公司打交道 收藏,你可能会得到更多 就你的钱而言 通过 优化您正在创建的对象 举办。毕竟,你有很多 更多的,否则你不会 需要收藏,对吗? 有些集合自然较小,例如LinkedList会比ArrayList小一点,但差异可能会被其使用方式的差异所掩盖 大多数java集合都可以手动调整大小—您可以将包含100个元素的arraylist设置为初始化为100个元素,并且可以将映射设置为以降低性能为代价保持较少的开放空间。都在javadocs中。
归根结底,最简单的方法就是自己测试。

正如其他人所指出的,你的问题没有明确说明

不过,有时基于ARARELIST的实现可以替代基于哈希映射的实现,我根本不考虑哈希表,它已经过时了。你可能需要烤焦


线性地更改ArrayList,但对于可能仍然足够快的小列表,ArrayList将需要更少的内存来存储相同的数据,因为它的开销更小。

这根本不是事实。Java中仍然可能存在内存泄漏-垃圾收集器将收集没有引用的对象,但如果应用程序保留对未使用对象的引用,则肯定会被归类为内存泄漏!土豆头先生是对的。在Java中,在处理集合时以及在不再需要集合时不删除项时,内存泄漏更容易发生。例如,如果堆栈是用ArrayList实现的,并且在项目被弹出时没有放置空指针,那么可能会出现泄漏。在您的答案中是否有对WeakHashMap的引用考虑到这个问题,以及对一些基本概念的误解,进入WeakHashMap这样的高级工具可能会适得其反。好吧,也许简单地提一下就可以了。@Potato先生:也许现在就这样离开会更好。@Potato先生和Jonik:好了!。反正我以前也没用过WHM。我没有这个必要。虽然我在理论上知道这一点;最近我做了一个相关的演讲:好吧,我想我们现在要删除所有的评论了?