Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建一个新的HashSet还是在调用HashSet.clear()后重用更好_Java_Memory_Jvm_Hashset - Fatal编程技术网

Java 创建一个新的HashSet还是在调用HashSet.clear()后重用更好

Java 创建一个新的HashSet还是在调用HashSet.clear()后重用更好,java,memory,jvm,hashset,Java,Memory,Jvm,Hashset,我想在HashSet中处理一些新数据,而不需要任何旧数据或旧HashSet对象。旧的HashSet对象没有在其他地方引用 是简单地执行hashset=newhashset()并让JVM释放旧hashset对象的内存更好,还是应该调用hashset.clear()并重用相同的hashset 根据openJDK,hashSet.clear()是: 和map.clear(): public void clear(){ modCount++; 条目[]选项卡=表格; 对于(int i=0;i

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

是简单地执行
hashset=newhashset()
并让JVM释放旧hashset对象的内存更好,还是应该调用
hashset.clear()
并重用相同的hashset

根据openJDK,hashSet.clear()是:

和map.clear():

public void clear(){
modCount++;
条目[]选项卡=表格;
对于(int i=0;i

由于map.clear()会迭代所有条目,所以当hashSet很大时会很耗时吗?在这种情况下,建议使用构造函数方法还是clear()方法?

在java中无法释放内存。你所能做的就是让虚拟机知道,如果它愿意,可以随时释放它。当事情超出范围时,通常会发生这种情况。一般来说,不用担心也没关系。如果您分析了应用程序,发现内存泄漏,那么您可以尝试查找它


绝对不要创建新的哈希集。clear()将从HashSet中删除所有项,但直到它超出范围后才会收集。

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


还要注意,假设您需要一个相同大小的新哈希集,

Simple不再引用您的
HashSet
,而是让垃圾收集器来完成这项工作


在取消引用之前清除
哈希集不会更快地释放内存。

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

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

如果你的地图上有很多项目,那么就不值得清理了。就像看到
clear()
方法的实现一样,它迭代所有元素。在这种情况下,创建新对象会便宜一些

但一般来说,让垃圾收集器负责清理事务是一个好主意,您可以继续创建新对象,而剩余的引用将由垃圾收集器清理

但作为经验法则,我们应该尝试限制正在创建的对象的数量。
正如我所说的,这要视情况而定。

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


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

我认为这里有一个误解。您不需要手动释放java中的内存。即使调用
System.gc()
不保证GC将在此时运行

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

clear()集合有进一步的工作,我认为建议使用code>:例如,如果您处理了其中的数据,并且准备将其他数据放入其中


实际上,我几乎从未见过显式的
mySet=null
(如果希望显式取消引用,这是应该使用的,因为
mySet=new HashSet()
没有任何意义)语句,因为只使用适当的作用域更容易、更省力。

所以释放内存的解决方案是分配更多内存?那没有任何意义。当对象超出范围时,它将被清除。您只是在用另一个映射替换一个映射。@EricStein我假设OP需要一个新的哈希集,否则它就毫无意义了。我已经澄清了。@assylias谢谢你,这真的很有帮助。你能告诉我,我需要把旧的hashSet赋值为null吗?它是否有助于“通知”GC释放内存?如果将hashSet中的每个条目都赋值为null是没有用的,那么为什么jdk本身应该提供这样的clear()函数,而不是简单地创建一个新的hashSet呢?是因为内存容量的原因吗?@wings如果将
null
赋值给任何变量,内存将不会被释放。如果内存已满,垃圾回收器将释放内存。@不能替换对象本身。因此,集合只能将所有引用设置为
null
。您可以从外部简单地创建一个新对象。只需hashSet=null@AniketThakur事实上,我需要一个新的哈希集。如果我以后要新建哈希集,是否也需要将哈希集指定为null?@wings否。不要将其设置为null。如果您需要一个新的哈希集,请创建一个。或者,最好使用另一个变量,因为新的HashSet可能会用于其他用途。谢谢。但我不太明白你说的“绝对不要做新的哈希集”。你能进一步解释一下吗?@wings如果你需要一个新的物体,做一个新的物体。不要只是创建一个来删除对旧的引用。
public void clear() {
    map.clear();
}
public void clear() {
     modCount++;
     Entry[] tab = table;
     for (int i = 0; i < tab.length; i++)
         tab[i] = null;
     size = 0;
 }