在下面的代码示例中,将键设置为null并被System.gc()
调用时,将WeakHashMap
丢失所有映射并清空。
class WeakHashMapExample {
public static void main(String[] args) {
Key k1 = new Key("Hello");
Key k2 = new Key("World");
Key k3 = new Key("Java");
Key k4 = new Key("Programming");
Map<Key, String> wm = new WeakHashMap<Key, String>();
wm.put(k1, "Hello");
wm.put(k2, "World");
wm.put(k3, "Java");
wm.put(k4, "Programming");
k1=null;
k2=null;
k3=null;
k4=null;
System.gc();
System.out.println("Weak Hash Map :"+wm.toString());
}
}
class Key{
private String key;
public Key(String key) {
this.key=key;
}
@Override
public boolean equals(Object obj) {
return this.key.equals((String)obj);
}
@Override
public int hashCode() {
return key.hashCode();
}
@Override
public String toString() {
return key;
}
}
Output: Weak Hash Map :{}
当WeakHashMap
与HashMap
和一起使用时,键设置为null,WeakHashMap
则不会丢失其键值映射。
class WeakHashMapExample {
public static void main(String[] args) {
Key k1 = new Key("Hello");
Key k2 = new Key("World");
Key k3 = new Key("Java");
Key k4 = new Key("Programming");
Map<Key, String> wm = new WeakHashMap<Key, String>();
Map<Key, String> hm=new HashMap<Key, String>();
wm.put(k1, "Hello");
wm.put(k2, "World");
wm.put(k3, "Java");
wm.put(k4, "Programming");
hm.put(k1, "Hello");
hm.put(k2, "World");
hm.put(k3, "Java");
hm.put(k4, "Programming");
k1=null;
k2=null;
k3=null;
k4=null;
System.gc();
System.out.println("Weak Hash Map :"+wm.toString());
System.out.println("Hash Map :"+hm.toString());
}
}
class Key{
private String key;
public Key(String key) {
this.key=key;
}
@Override
public boolean equals(Object obj) {
return this.key.equals((String)obj);
}
@Override
public int hashCode() {
return key.hashCode();
}
@Override
public String toString() {
return key;
}
}
输出: Weak Hash Map :{Java=Java, Hello=Hello, World=World, Programming=Programming}
Hash Map :{Programming=Programming, World=World, Java=Java, Hello=Hello}
我的问题是,WeakHashMap
即使丢弃了密钥,为什么在第二个代码示例中也不会丢失其条目?
一个WeakHashMap
丢弃条目时,关键是不再活码强可到达。由于HashMap
维护人员对键具有严格的引用,因此键仍然可以访问,WeakHashMap
并且不会丢弃条目。
关键是行为与键对象的引用有关,而不是与一次引用键的任何变量的值有关。
WeakHashMap是Map接口的一个实现,它只存储对其键的弱引用。 仅存储弱引用允许在其键不再在WeakHashMap之外引用时对键值对进行垃圾收集。 此类提供了利用弱引用功能的最简单方法。 它对于实现“类似注册表”的数据结构很有用,其中当任何线程不再可以访问其密钥时,条目的实用程序就会消失。 WeakHashMap的功能与HashMap相同,但有一个非常重要的例外:如果Java内存管理器不再
问题内容: 我正在使用实现缓存。我想知道是否要遍历此映射的键,同时垃圾回收器正在主动从此映射中删除键,我会收到吗?我不这么认为,因为据我所知,并发修改异常是由于应用程序代码中的错误而发生的,开发人员忘记了同一个映射是由其他线程共享/使用的,因此在这种情况下,应该不会发生。但是想知道当WeakHashMap不同步时JVM将如何处理吗? 问题答案: 正如bkail所说,当GC从a中“删除”一个条目时,
我正在阅读关于WeakHashMap的Java文档,我得到了基本概念。由于GC线程在后台运行,因此可能会出现“异常行为”,例如在迭代时出现ConcurrentModificationException等。 我不明白的是,如果默认实现没有同步,并且没有以任何方式包含锁,那么为什么不可能得到不一致的状态呢。假设你有两条线。GC线程在某个索引处删除某个键,同时,在同一索引处,用户线程在数组中插入一个键值
问题内容: 什么是a ,何时应该使用它?a 和a有什么区别? 问题答案: 如果没有其他对键对象的强引用,则弱哈希图中的元素可以由垃圾回收器回收,这使它们对于缓存/查找存储很有用。 弱引用不限于这些哈希表,您可以对单个对象使用WeakReference。它们对于节省资源很有用,您可以保留对某些内容的引用,但在没有其他引用的情况下允许对其进行收集。(顺便说一句,强引用是普通的Java引用)。还有一些弱
本文向大家介绍Java WeakHashMap clear()方法与示例,包括了Java WeakHashMap clear()方法与示例的使用技巧和注意事项,需要的朋友参考一下 WeakHashMap类方法 clear()方法在java.util包中可用。 clear()方法用于清除此WeakHashMap中的所有映射。 clear()方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称
本文向大家介绍Java WeakHashMap containsKey()方法与示例,包括了Java WeakHashMap containsKey()方法与示例的使用技巧和注意事项,需要的朋友参考一下 WeakHashMap类方法 containsKey()方法在java.util包中可用。 containsKey()方法用于检查此映射对象是否包含给定键元素(key_ele)的映射。 conta