📅  最后修改于: 2023-12-03 15:31:57.656000             🧑  作者: Mango
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()
来创建一个新的字符串对象。