Java HashMap.clear()和remove()内存是否有效?

Java HashMap.clear()和remove()内存是否有效?,java,memory,hashmap,Java,Memory,Hashmap,考虑以下HashMap.clear()code: /** * Removes all of the mappings from this map. * The map will be empty after this call returns. */ public void clear() { modCount++; Entry[] tab = table; for (int i = 0; i < tab.length; i++) tab[i

考虑以下
HashMap.clear()
code:

 /**
 * Removes all of the mappings from this map.
 * The map will be empty after this call returns.
 */
public void clear() {
    modCount++;
    Entry[] tab = table;
    for (int i = 0; i < tab.length; i++)
        tab[i] = null;
    size = 0;
}
/**
*从此映射中删除所有映射。
*此调用返回后,映射将为空。
*/
公共空间清除(){
modCount++;
条目[]选项卡=表格;
对于(int i=0;i

看起来,
条目
对象的内部数组(
)从未收缩过。因此,当我向一个映射添加10000个元素时,在调用
map.clear()
之后,它将在其内部数组中保留10000个空值。所以,我的问题是,JVM如何处理这个空数组,因此,
HashMap
内存是否有效?

其思想是,只有当您想重新使用
HashMap
时才会调用
clear()
。重用对象的原因应该与以前使用对象的原因相同,所以很有可能会有大致相同数量的条目。为避免对
Map
进行无用的收缩和调整大小,调用
clear()
时,容量保持不变


如果您只想丢弃
Map
中的数据,那么您不需要(事实上也不应该)对其调用
clear()
,只需清除对
Map
本身的所有引用,在这种情况下,它最终将被垃圾收集。

您是对的,但是,考虑到增加数组是一项成本更高的操作,HashMap认为“一旦用户增加了数组,他很可能以后会再次需要这个大小的数组”,然后离开数组,而不是减少数组,并冒着以后不得不昂贵地再次扩展它的风险,这并不是不合理的。这是一个试探,我想,你也可以提倡另一种方式。

< P>另一个要考虑的是<代码>表< /> >中的每个元素仅仅是一个引用。将这些条目设置为null将从
映射中的项目中删除引用,然后这些项目将可以免费进行垃圾收集。因此,这并不是说你根本没有释放任何内存

但是,如果您甚至需要释放
映射本身正在使用的内存,那么您应该按照Joachim Sauer的建议释放它。

,它看起来确实像
HashMap
永不收缩。只要需要,就会调用
resize
方法将大小加倍,但没有任何功能


如果您使用的
HashMap
的增长和收缩非常频繁,您可能需要创建一个新的
HashMap
,而不是调用
clear()

,我还想补充一点,这种行为不属于文档化契约的一部分,因此,即使您偶然发现了调整内部数组大小的实现(这似乎不太可能),那么您可能也不应该依赖它,除非它明确地将其作为契约的一部分。这很好,但是如果HashMap用于某种单音,并且总是包含一些数据,因此不能用新实例来替换它呢?在某些情况下,它可以获取一大部分数据,这些数据将在那里保存一段时间,然后被删除。但数组中的空值将保留。看起来不太好。@Saman:你刚才说的只是另一个不使用singelton模式的理由;-)Entry是一个简单的类,它包含对键、值、下一个条目和哈希代码的引用。我不确定引用需要多少内存,但假设它是4字节,那么在
条目[]
中有一百万个空插槽的哈希映射比没有插槽的哈希映射多消耗大约4MB内存。对我来说,这听起来没什么好担心的;如果有的话,你的独裁者应该在管理它的数据中起到更积极的作用(即如果它持有一个积极地调整大小的地图,它应该考虑在大到小的时候创建新的实例)@萨满,如果它在单体中使用,你仍然可以在单体上有一个函数(希望同步)。创建一个新实例。10000个空值占用了40KB(在64位JVM上可能是80个)。@Michael,也许吧,但这无关紧要:这个数字可以扩展到任何规模。OP是问一个原则问题。可能地图很大,可能可用内存很小。我们不知道。地图上有一万个元素!=内部表中有10000个条目。请先了解HashMap impl是如何工作的。。。