创建新的HashSet或在调用hashSet.clear()之后重用是否更好?

win*_*ngs 6 java memory jvm hashset

我想在HashSet中处理一些新数据,不需要任何旧数据或旧的HashSet对象.其他地方没有引用旧的HashSet对象.

简单地做hashset = new HashSet<String>()并让JVM释放旧HashSet对象的内存或者我应该调用hashSet.clear()并重用相同的HashSet 是否更好?

根据openJDK,hashSet.clear()是:

public void clear() {
    map.clear();
}
Run Code Online (Sandbox Code Playgroud)

和map.clear():

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)

由于map.clear()会迭代所有条目,所以当hashSet很大时会耗费时间吗?在这种情况下推荐使用哪一个,构造函数方法或clear()方法?

Uwe*_*nus 6

简单的不要再引用你HashSet了,让垃圾收集器完成工作.

清除HashSet之前取消引用它不会更快地释放内存.


ass*_*ias 4

清除 HashSet 是不必要的 - 只需删除对 HashSet 的所有引用(如果您编写hashset = new HashSet<>();,就会发生这种情况,假设旧的 HashSet 在其他任何地方都没有引用),垃圾收集器将完成其余的工作。

另请注意,假设您需要一个相同大小的新 HashSet,则调用hashset.clear()比简单地创建一个具有适当容量的新 HashSet 需要更多时间

  • 那么释放内存的解决方案是分配更多内存吗?这没有任何意义。当对象超出范围时,该对象将被清除。您只需将一张地图替换为另一张地图即可。 (2认同)
  • @wings如果将“null”分配给任何变量,内存将不会被快速释放。如果内存已满,垃圾收集器会释放内存。 (2认同)