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

2022-08-31 22:27:48

考虑一下 follwing 代码: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;
}

看起来,对象的内部数组()永远不会缩小。因此,当我向映射添加 10000 个元素时,在该调用之后,它将在其内部数组中保留 10000 个 null。所以,我的问题是,JVM如何处理这个无的数组,因此,内存是有效的吗?tableEntrymap.clear()HashMap


答案 1

这个想法是,仅当您想要重用 .重用对象只能出于与以前使用对象相同的原因进行,因此您可能会拥有大致相同的条目数。为了避免无用的收缩和调整容量的大小,在调用时保持相同。clear()HashMapMapclear()

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


答案 2

看看源代码,它看起来确实永远不会缩小。该方法在需要时调用以将大小加倍,但没有任何内容ArrayList.trimToSize()HashMapresize

如果您以一种经常急剧增长和收缩的方式使用 a,则可能只想创建一个新的,而不是调用 。HashMapHashMapclear()