2013-04-22 83 views
2

雖然做了一些關於如何在Android中傳遞對象引用的研究,但我正在考慮以下內容。WeakHashMap類型如長,Int或字符串

我們假設我有一個WeakHashmap和Long作爲鍵。現在我把一個對象放到這個WeakHashMap中,並將它分配給key'new Long(1)'(假設我將保存對這個Long的引用)。

現在應用程序的另一部分創建一個新的Long(1),之後我將第一個Long(用作鍵)設置爲null。

  1. WeakHashMap中的對象會發生什麼情況?
  2. 如果我用Long成員替換Long並讓它的compare()方法返回true,如果它與Long中具有相同值的另一個相同類型的對象(我自己的類)進行比較,則返回true。
  3. 假設在這兩種情況下WeakReference被清除。如果在清除第一個輸出之前使用我的第二個創建的密鑰訪問WeakHasMap一次,它會有所作爲嗎?
+0

使用'WeakHashMap'與你不能控制的類型相當危險。 – 2013-04-22 20:30:38

+0

如果你知道自己在做什麼,通常有風險的事情會變得非常方便。這就是爲什麼我問;-) – Chris 2013-04-22 22:10:57

回答

10

如果沒有強引用內存,則弱引用將被垃圾回收。

現在,你的例子。這有點棘手。通過javadoc for LongvalueOf方法通過「緩存頻繁請求的值」來提高性能。這意味着無論您使用valueOf還是new,它都會對答案產生影響。

在你的情況下,你使用new,因此每個new Long(1)將是一個不同的對象 - 即不同的參考。但是請記住這一點 - Integer,Long和JVM通常緩存的其他包裝類型可能不像您期望的那樣在WeakHashMap中運行。 String被攔截,所以他們也有問題。

總之,要回答你的問題:

  1. 如果沒有你原來Long更強大的參考文獻,然後映射將在下次有機會來GC'ed。
  2. 我想你在這裏很困惑。 A HashMap使用hashcodeequals進行比較。 A TreeMap使用compareTo。在任何情況下,這都沒有什麼區別,這是關於參考而不是關於任何平等的概念。如果沒有更強的對象引用,那麼映射將被GC化。
  3. 不,它不會。正如我在2中所說的那樣 - Map使用hashcodeequals來檢查密鑰是否已經在Map中。 Weak部分正在討論參考。兩個對象可以是equals但不是==

您可以使用PhantomReferencetrack when your key is GC'ed。這可能會幫助您瞭解引用的工作方式。

+0

明確的答案。謝謝 – Chris 2013-04-22 19:49:26

相關問題