📜  Java中的WeakHashMap putall() 方法(1)

📅  最后修改于: 2023-12-03 15:02:00.321000             🧑  作者: Mango

Java中的WeakHashMap putAll()方法

在Java中,WeakHashMap是一种实现了Map接口的类,使用弱引用来保存键,当某个键不再有任何强引用指向时,该键值对会被自动删除,防止内存泄漏。

而putAll()方法则是将一个Map中的所有键值对都添加到当前的WeakHashMap中。

语法
public void putAll(Map<? extends K,? extends V> m)

参数:

  • m:要添加到当前WeakHashMap中的键值对。
示例
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,也就不再关联到任何值,因此不会触发垃圾回收。这样可以避免内存泄漏问题。