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

时间:2013-08-29 11:28:57

标签: java memory jvm hashset

我想在HashSet中处理一些新数据,不需要任何旧数据或旧的HashSet对象。旧的HashSet对象未在别处引用。

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

根据openJDK,hashSet.clear()是:

public void clear() {
    map.clear();
}

和map.clear():

public void clear() {
     modCount++;
     Entry[] tab = table;
     for (int i = 0; i < tab.length; i++)
         tab[i] = null;
     size = 0;
 }

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

7 个答案:

答案 0 :(得分:6)

简单地不再引用你的HashSet并让垃圾收集器完成工作。

在解除引用之前清除HashSet不会更快地释放内存。

答案 1 :(得分:4)

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

另请注意,假设您需要一个大小相同的新HashSet calling hashset.clear() takes more time than simply creating a new one with the appropriate capacity

答案 2 :(得分:3)

我认为这里有一种误解。你不能手动释放java中的内存。即使您致电System.gc();,也不能保证GC将在那一刻运行。

关于你的问题:我认为你应该在尽可能小的范围内使用你的引用,当代码离开Set范围时,对它的引用就会被删除,GC会收集它。

clear();我认为如果您对Set有一些进一步的工作,建议使用:例如,如果您处理了其中的数据,并且您准备在其中添加其他数据。< / p>

在实践中,我几乎从来没有看到明确的mySet = null; (如果你想要显式解引用,那么你应该使用它,因为mySet = new HashSet<>()没有任何意义)语句,因为它是使用适当的范围要容易得多,也不那么麻烦。

答案 3 :(得分:2)

在java中释放内存是不可能的。你所能做的就是让虚拟机知道如果它想要的话可​​以免费使用它。当事情超出范围时,这通常会发生。一般来说,不用担心它是可以的。如果您已经分析了应用程序,并且发现了内存泄漏,那么您可以尝试找到它。

绝对不要制作新的HashSet。 clear()将从HashSet中删除所有项目,但是在它超出范围之前仍然不会被收集。

答案 4 :(得分:0)

如果您没有对对象的任何引用,垃圾收集器会自动删除它们。您无需手动执行此操作。

答案 5 :(得分:0)

这取决于,如果您的地图非常小,那么在这种情况下,清除将比生成对象更好。

如果你的地图中有很多物品,那么它甚至不值得清除。就像您看到clear()方法的实现一样,它遍历所有元素。在这种情况下,创建新对象会更便宜。

但通常最好让垃圾收集器处理清理事务,然后继续创建新对象,而垃圾收集器将清除左侧引用。

但是根据经验,应该尝试限制正在创建的对象的数量。 正如我所说的那样。

答案 6 :(得分:0)

内存管理由JVM自己完成。因此,即使您手动释放内存,也不会自动进行垃圾收集。

垃圾收集器减少了有关内存管理的编码工作。