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

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

Java中的WeakHashMap containsKey()方法

介绍

Java中的WeakHashMap是一种内存友好型的Map实现。与HashMap不同,WeakHashMap使用弱引用(weak reference)来实现对键的引用。这意味着,当某个键不再被任何其他对象引用时,它就可以被垃圾回收器回收,WeakHashMap中对应的键值对也随之被清除。

containsKey(Object key)Map接口的一个方法,可以用来判断Map中是否存在指定的键。在WeakHashMap中,containsKey(Object key)方法的作用是判断WeakHashMap中是否存在一个与参数key相等的键。如果参数key已被回收,那么containsKey(Object key)将返回false

用法示例:
import java.util.WeakHashMap;

public class Example {
    public static void main(String[] args) {
        WeakHashMap<String, String> map = new WeakHashMap<>();
        
        String key = new String("key"); // 创建一个新字符串对象"key"
        String value = "value";
        map.put(key, value); // 将键值对(key, value)插入WeakHashMap
        
        System.out.println(map.containsKey(key)); // true,因为key还未被回收
        
        key = null; // 将key引用设为null,使key指向的字符串对象变成无法访问的对象
        System.gc(); // 手动触发垃圾回收器
        
        // 若垃圾回收器调用,则WeakHashMap中的键值对(key, value)会被清除
        System.out.println(map.containsKey("key")); // false
        
        value = null; // 将value引用设为null,使value所指向的对象变成无法访问的对象
        System.gc(); // 再次手动触发垃圾回收器
        
        // value引用所指向的对象不再被使用,但WeakHashMap中仍然有一个值为"value"的对象。
        // 这是因为在Java中,字符串对象有个内建的字符串池,会永久地维护字符串对象
        // 为了确保字符串对象能被回收,我们应当使用new String()来创建一个新的字符串对象。
        System.out.println(map.containsValue("value")); // false
    }
}

在上述示例中,我们创建了一个WeakHashMap对象,并将一个新字符串对象"key"作为键,将字符串"value"作为值插入到WeakHashMap中。我们使用containsKey(Object key)方法来判断WeakHashMap中是否存在键"key",并输出判断结果。接下来,我们将key引用设为null,手动触发垃圾回收器。此时,由于key所指向的字符串对象已经变成无法访问的对象,所以垃圾回收器会将其回收。由于WeakHashMap中的键值对中的键已经被回收,因此containsKey(Object key)方法最终返回false

我们还展示了如何使用containsValue(Object value)方法来判断WeakHashMap中是否已经不存在值为"value"的对象。为了确保所有对象都能被回收,我们还介绍了如何使用new String()来创建一个新的字符串对象。

总结

containsKey(Object key)方法是Map接口中的一个方法,它可以用来判断Map中是否存在指定的键。在WeakHashMap中,由于使用了弱引用来实现对键的引用,因此当某个键被回收之后,containsKey(Object key)方法将返回false。为了确保所有对象都能被回收,我们应当小心地创建对象。特别是,为了确保字符串对象能被回收,我们应当使用new String()来创建一个新的字符串对象。