gpt4 book ai didi

java - HashMap 与 WeakHashMap 一起被垃圾收集?

转载 作者:行者123 更新时间:2023-12-01 23:19:59 25 4
gpt4 key购买 nike

据我了解,HashMap 不应该被垃圾回收,而 WeakHashMap 应该被垃圾回收,但是当我运行这段代码时,hashmap 和 weakhashmap 都被垃圾回收。

import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
HashMap<String,Temp> hashMap= new HashMap<>();
hashMap.put("a", new Temp("hashmap"));
WeakHashMap<String,Temp> weakHashMap= new WeakHashMap<>();
weakHashMap.put("a", new Temp("identity hashmap"));
hashMap= null;
weakHashMap= null;
System.gc();
try {
Thread.sleep(5000);
}catch(InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
System.out.println(hashMap);
System.out.println(weakHashMap);
}
}
class Temp {
String name;
Temp(String name) {
this.name= name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name+":: Finalize Method Executed");
}
@Override
public String toString() {
return this.name;
}
}

输出:

identity hashmap:: Finalize Method Executed
hashmap:: Finalize Method Executed
null
null

虽然仅使用 HashMap,但它不会被 GC 回收。

import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
HashMap<String,Temp> hashMap= new HashMap<>();
hashMap.put("a", new Temp("hashmap"));
System.gc();
try {
Thread.sleep(5000);
}catch(InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
System.out.println(hashMap);
}
}
class Temp {
String name;
Temp(String name) {
this.name= name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name+":: Finalize Method Executed");
}
@Override
public String toString() {
return this.name;
}
}

输出:

{a=hashmap}

最佳答案

首先不要使用 finalize - 它已被弃用,有更好的方法来清理你自己并且 SO 充满了这样的帖子(ReferenceQueueSoftReferences 就是其中之一)。

然后不要使用内部缓存的对象作为 WeakHashMap 中的键(String 就是这样)。

最后一点是,这与WeakHashMap无关,这是Objects的基本活力。在您的第一个示例中,您显式将引用设置为 null,因此它们会被 GC 清除,而在您的第二个示例中则不会,并通过System.out.println(hashMap);;因此它不会被收集。

关于java - HashMap 与 WeakHashMap 一起被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52760002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com