簡體   English   中英

HashMap - 更改鍵值

[英]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實例的副本,它只保留引用的副本。

另一方面,對於WeakHashMapWeakHashMap中鍵的存在並不能阻止它被垃圾收集,因此如果沒有其他對您放入映射中的鍵的引用,GC 可以釋放該實例。 因此,在將新實例分配給emp1 ,只有映射包含對其引用的原始實例的引用,並且 GC 可以釋放它。

這是相關的 Javadoc 參考:

WeakHashMap 中的條目將在其鍵不再正常使用時自動刪除。 更准確地說,給定鍵的映射的存在不會阻止該鍵被垃圾收集器丟棄

編輯 :

至於執行如何WeakHashMap是不同的,所述Entry一個的WeakHashMap延伸WeakReference<Object> ,它是指另一個實例(在這種情況下,條目的鍵)的實例,並不能防止其所指被釋放由 GC。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM