当前位置: 首页 > 面试题库 >

WeakHashMap和HashMap

宰父才
2023-03-14
问题内容

在下面的代码示例中,将键设置为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 :{}

WeakHashMapHashMap和一起使用时,键设置为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