📅  最后修改于: 2023-12-03 15:02:00.321000             🧑  作者: Mango
在Java中,WeakHashMap是一种实现了Map接口的类,使用弱引用来保存键,当某个键不再有任何强引用指向时,该键值对会被自动删除,防止内存泄漏。
而putAll()方法则是将一个Map中的所有键值对都添加到当前的WeakHashMap中。
public void putAll(Map<? extends K,? extends V> m)
参数:
import java.util.Map;
import java.util.WeakHashMap;
public class Main {
public static void main(String[] args) {
// 创建两个Map对象
Map<Key, Value> map1 = new WeakHashMap<>();
Map<Key, Value> map2 = new WeakHashMap<>();
// 向map1中添加键值对
Key key1 = new Key(1);
map1.put(key1, new Value("value1"));
Key key2 = new Key(2);
map1.put(key2, new Value("value2"));
// 将map1中的键值对添加到map2中
map2.putAll(map1);
System.out.println("map1: " + map1);
System.out.println("map2: " + map2);
// 清空map1
map1.clear();
System.gc(); // 手动触发垃圾回收
// 等待一段时间,确保垃圾回收已完成
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("map1: " + map1);
System.out.println("map2: " + map2);
}
}
class Key {
private int key;
public Key(int key) {
this.key = key;
}
@Override
public String toString() {
return "Key{" +
"key=" + key +
'}';
}
@Override
protected void finalize() throws Throwable {
System.out.println("finalize Key " + key);
}
}
class Value {
private String value;
public Value(String value) {
this.value = value;
}
@Override
public String toString() {
return "Value{" +
"value='" + value + '\'' +
'}';
}
@Override
protected void finalize() throws Throwable {
System.out.println("finalize Value " + value);
}
}
以上代码中,我们创建了两个WeakHashMap对象,map1和map2。首先向map1中添加两个键值对,然后使用putAll()方法将其添加到map2中。然后我们清空map1并手动调用垃圾回收系统。最后我们等待500毫秒,确保垃圾回收已完成。最终输出的结果如下所示:
finalize Key 1
finalize Key 2
finalize Value value1
finalize Value value2
map1: {}
map2: {Key{key=1}=Value{value='value1'}, Key{key=2}=Value{value='value2'}}
finalize Key 1
finalize Key 2
finalize Value value1
finalize Value value2
map1: {}
map2: {}
可以看到,在清空map1并手动调用垃圾回收系统后,map1中的所有键值对都被自动删除了,而map2中的键值对仍然存在。这是因为我们使用putAll()方法将map1中的键值对复制到了map2中,而在map2中的键是对map1中的键的弱引用,当map1中的键不再有强引用指向时,map1中的键值对会被自动删除,而map2中的键会自动变成null,也就不再关联到任何值,因此不会触发垃圾回收。这样可以避免内存泄漏问题。