[英]HashMap - Changing key value
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);`
雖然emp
值被改變了,但它並沒有反映在 HashMap 中。 是因為 HashMap 在放置新值時使用了某種復制構造函數嗎?
現在來到 WeakHashMap :
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");
在一些 GC 調用之后, aMap1
變為空。 為什么這樣? 是不是因為指向的鍵已經不存在了?
更新:我從答案中了解到鍵是從 HashMap 引用的,因此當上面的HashMap
emp
(可變鍵)通過向其附加一個 String 來更改時,例如emp.append("changed")
,它反映在HashMap
。 WeakHashMap
也是如此(如果可變鍵被更改/更新,則更改會反映)。 這意味着密鑰是從 WeakHashMap 引用的。
任何人都可以解釋一下WeakHashMap
實現的不同之處在於,盡管密鑰被引用,但可以被垃圾收集?
謝謝。
emp = new StringBuilder("sss");
不會影響HashMap
已經存在的條目(由語句new StringBuilder("Stack");
創建的條目),因為HashMap
包含它自己對最初由emp
引用的StringBuilder
實例的引用。 它不會創建StringBuilder
實例的副本,它只保留引用的副本。
另一方面,對於WeakHashMap
, WeakHashMap
中鍵的存在並不能阻止它被垃圾收集,因此如果沒有其他對您放入映射中的鍵的引用,GC 可以釋放該實例。 因此,在將新實例分配給emp1
,只有映射包含對其引用的原始實例的引用,並且 GC 可以釋放它。
這是相關的 Javadoc 參考:
WeakHashMap 中的條目將在其鍵不再正常使用時自動刪除。 更准確地說,給定鍵的映射的存在不會阻止該鍵被垃圾收集器丟棄
編輯 :
至於執行如何WeakHashMap
是不同的,所述Entry
一個的WeakHashMap
延伸WeakReference<Object>
,它是指另一個實例(在這種情況下,條目的鍵)的實例,並不能防止其所指被釋放由 GC。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.