2025年weakHashMap 用法

weakHashMap 用法WeakHashMap 此种 Map 的特点是 当除了自身有对 key 的引用外 此 key 没有其他引用 那么 GC 之后此 map 会自动丢弃此值 当使用 WeakHashMap 时 即使没有显示的添加或删除任何素 也可能发生如下情况 调用两次 size 方法返回不同的值 两次调用 isEmpty 方法 第一次返回 false 第二次返回 true 两次调用 containsKey 方法

WeakHashMap,此种Map的特点是:

当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值

当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:

调用两次size()方法返回不同的值;

两次调用isEmpty()方法,第一次返回false,第二次返回true;

两次调用containsKey()方法,第一次返回true,第二次返回false,尽管两次使用的是同一个key;

两次调用get()方法,第一次返回一个value,第二次返回null,尽管两次使用的是同一个对象。

举例来说:声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap remove掉a 并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象而言,当HashMap remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经没有指向a的指针了,所以WeakHashMap会自动舍弃掉a,而对于b对象虽然指向了null,但HashMap中还有指向b的指针,所以WeakHashMap将会保留。

public class Weakmap { 

public static void main(String[] args) throws Exception {

String a = new String("a");
String b = new String("b");
Map weakmap = new WeakHashMap();
Map map = new HashMap();
map.put(a, "aaa");
map.put(b, "bbb");

weakmap.put(a, "aaa");
weakmap.put(b, "bbb");

map.remove(a);

a=null;
b=null;

System.gc();
Iterator i = map.entrySet().iterator();
while (i.hasNext()) {

Map.Entry en = (Map.Entry)i.next();
System.out.println("map:"+en.getKey()+":"+en.getValue());
}

Iterator j = weakmap.entrySet().iterator();
while (j.hasNext()) {

Map.Entry en = (Map.Entry)j.next();
System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
}
}
弱引用(WeakReference)。我们都知道Java中内存是通过GC自动管理的,GC会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。GC判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的“有效引用”并不包括弱引用。也就是说,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。
WeakHashMap 内部是通过弱引用来管理entry的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?将一对key, value放入到 WeakHashMap 里并不能避免该key值被GC回收,除非在 WeakHashMap 之外还有对该key的强引用。
编程小号
上一篇 2025-03-06 20:57
下一篇 2025-03-16 12:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/113154.html