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

Ill*_*huk 42 java memory hashmap

考虑以下HashMap.clear()代码:

 /**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

看来,对象的内部数组(table)Entry永远不会收缩.因此,当我向地图添加10000个元素时,在该调用之后map.clear(),它将在其内部数组中保留10000个空值.所以,我的问题是,JVM如何处理这个数组,因此,HashMap内存是否有效?

Joa*_*uer 62

这个想法clear()只有当你想重新使用它时才被调用HashMap.重复使用对象的原因与之前使用的原因相同,因此您可能会有大致相同的条目数.为了避免无用的收缩和调整Map容量,clear()调用时容量保持不变.

如果您要做的只是放弃数据Map,那么您不需要(实际上不应该)调用clear()它,而只需清除对Map自身的所有引用,在这种情况下,它最终将被垃圾收集.

  • @Shaman:你刚刚给出的是另一个不使用singelton模式的原因;-) (6认同)
  • HashMap.Entry是一个简单的类,它包含对键,值,下一个Entry和哈希码的引用.我不确定引用有多少内存,但假设它是4个字节,那么一个带有一百万个空槽的HashMap的`Entry []`消耗的内存比没有插槽的HashMap多大约4MB.对我而言,这听起来并不值得关注; 如果有的话,你的单身人士应该在管理它的数据方面发挥更积极的作用(即如果它持有积极调整大小的Map,它应该考虑在从大到小时创建新实例) (3认同)
  • @Shaman,如果它在单例中使用,你仍然可以在单例上有一个函数(希望同步)来创建一个新实例. (2认同)

pol*_*nts 10

看一下源代码,它看起来似乎HashMap永远不会缩小.resize调用该方法可以在需要时将大小加倍,但没有任何ala ArrayList.trimToSize().

如果你以一种HashMap经常增长和缩小的方式使用a ,你可能只想创建一个新的HashMap而不是调用clear().