Reference 混淆java.util.WeakHashMap行为?;

Reference 混淆java.util.WeakHashMap行为?;,reference,jvm,weakhashmap,Reference,Jvm,Weakhashmap,这里有三种情况,为什么case1的结果是{name=Bob},而case2的结果是{},case3仍然是{name=Bob}。案例1和案例2的不同之处在于放置不同的键。在JDK8上运行。为什么? //Case1: WeakHashMap<String,String> mapCase1 = new WeakHashMap<>(); mapCase1.put("name", "Bob"); System.

这里有三种情况,为什么case1的结果是{name=Bob},而case2的结果是{},case3仍然是{name=Bob}。案例1和案例2的不同之处在于放置不同的键。在JDK8上运行。为什么?

    //Case1:
    WeakHashMap<String,String> mapCase1 = new WeakHashMap<>();
    mapCase1.put("name", "Bob");
    System.gc();
    Thread.sleep(3000);
    System.out.println(mapCase1); //{name=Bob}
    //Case2:
    WeakHashMap<String,String> mapCase2 = new WeakHashMap<>();
    mapCase2.put(new String("name"), "Bob");
    System.gc();
    Thread.sleep(3000);
    System.out.println(mapCase2); //{}
    //Case3:
    WeakHashMap<String,String> mapCase3 = new WeakHashMap<>();
    String map3Key = new String("name");
    mapCase3.put(map3Key, "Bob");
    System.gc();
    Thread.sleep(3000);
    System.out.println(mapCase3); //{name=Bob}
//案例1:
WeakHashMap mapCase1=新的WeakHashMap();
地图1.put(“姓名”、“鲍勃”);
gc();
睡眠(3000);
System.out.println(mapCase1)//{name=Bob}
//案例2:
WeakHashMap mapCase2=新的WeakHashMap();
mapCase2.put(新字符串(“name”),“Bob”);
gc();
睡眠(3000);
System.out.println(mapCase2)//{}
//案例3:
WeakHashMap mapCase3=新的WeakHashMap();
字符串map3Key=新字符串(“名称”);
mapCase3.put(map3Key,Bob);
gc();
睡眠(3000);
System.out.println(mapCase3)//{name=Bob}

您发现什么让人困惑?你认为这应该怎么做?为什么?这正是我们所期望的。当密钥对象不可访问时,在垃圾收集后将删除映射。通常不建议在不同对象可以为
WeakHashMap
@apangin相等的情况下使用键。为什么case1是{name=Bob},我希望是{},case2和case3是相同的,为什么结果不同?
“name”
是一个字符串文字,其计算结果是一个将保留在运行时的规范对象,只要代码<代码>字符串map3Key=新字符串(“名称”)将引用分配给保持对象被引用的变量。原则上,当所有引用它的代码都被垃圾收集时,它可能被收集,这只有在自定义类加载器中才能实现,因为整个类加载器及其创建的所有类都必须无法访问。因此,在大多数实际情况下,
“name”
将永远不会被收集,因此,当用作键时,始终保持在
WeakHashMap
中。您到底发现了什么让人困惑?你认为这应该怎么做?为什么?这正是我们所期望的。当密钥对象不可访问时,在垃圾收集后将删除映射。通常不建议在不同对象可以为
WeakHashMap
@apangin相等的情况下使用键。为什么case1是{name=Bob},我希望是{},case2和case3是相同的,为什么结果不同?
“name”
是一个字符串文字,其计算结果是一个将保留在运行时的规范对象,只要代码<代码>字符串map3Key=新字符串(“名称”)将引用分配给保持对象被引用的变量。原则上,当所有引用它的代码都被垃圾收集时,它可能被收集,这只有在自定义类加载器中才能实现,因为整个类加载器及其创建的所有类都必须无法访问。因此,在大多数实际情况下,
“name”
永远不会被收集,因此,当用作键时,始终保持在
WeakHashMap
中。