Java HashMap-更改键值

Java HashMap-更改键值,java,weak-references,Java,Weak References,在一些GC调用之后,aMap1变为空。为什么会这样?是不是因为指向的键已经不存在了 更新:我从回答中了解到密钥是从HashMap引用的,因此当上面的HashMap中的emp(可变密钥)通过向其添加字符串进行更改时,如emp.append(“changed”),它会反映在HashMap中。对于WeakHashMap(如果更改/更新了可变键,则会反映更改)。这意味着密钥是从WeakHashMap引用的 有人能解释一下什么是WeakHashMap实现的不同之处,即密钥可以通过引用进行垃圾收集 谢谢。e

在一些GC调用之后,
aMap1
变为空。为什么会这样?是不是因为指向的键已经不存在了

更新:我从回答中了解到密钥是从HashMap引用的,因此当上面的
HashMap
中的
emp
(可变密钥)通过向其添加字符串进行更改时,如
emp.append(“changed”)
,它会反映在
HashMap
中。对于
WeakHashMap
(如果更改/更新了可变键,则会反映更改)。这意味着密钥是从WeakHashMap引用的

有人能解释一下什么是
WeakHashMap
实现的不同之处,即密钥可以通过引用进行垃圾收集


谢谢。

emp=new StringBuilder(“sss”)
不会影响
HashMap
(由语句
新建StringBuilder(“堆栈”);
创建的条目),因为
HashMap
包含它自己对
StringBuilder
实例的引用,该实例最初由
emp
引用。它不创建
StringBuilder
实例的副本,只保留引用的副本

另一方面,对于
WeakHashMap
,在
WeakHashMap
中存在一个键不会阻止它被垃圾收集,因此如果没有其他对您放入映射中的键的引用,GC可以释放该实例。因此,在将新实例分配给
emp1
之后,只有映射包含对其引用的原始实例的引用,并且GC可以释放它

以下是相关的Javadoc参考:

WeakHashMap中的条目在其密钥不再正常使用时将自动删除。更准确地说,给定密钥映射的存在不会阻止该密钥被垃圾收集器丢弃

编辑:


至于
WeakHashMap
的实现有何不同,一个
WeakHashMap
条目
扩展了
WeakReference
,该实例引用了另一个实例(本例中的条目键),并且不会阻止GC释放其引用对象。

谢谢!我现在明白了。我还有一个问题。请看update@user2296988请参见编辑。有关更多详细信息,请阅读关于WeakReference的信息。
HashMap<StringBuilder, StringBuilder> aMap = new 
       HashMap<StringBuilder, StringBuilder>();

StringBuilder emp = new StringBuilder("Stack");
StringBuilder val = new StringBuilder("Programmer");

aMap.put(emp, val);
emp = new StringBuilder("sss");
System.out.println(aMap);`
WeakHashMap<StringBuilder, StringBuilder> aMap1 = 
            new WeakHashMap<StringBuilder, StringBuilder>();
    StringBuilder emp1 = new StringBuilder("WeakStack");
    StringBuilder val1 = new StringBuilder("Programmer");
aMap1.put(emp1, val1);
emp1 = new StringBuilder("WeakStack1");