2013-10-30 12 views
2
public static void main(String[] args) { 
    IdentityHashMap<Integer, Object> m1 = new IdentityHashMap<Integer, Object>(); 
    Integer ONE = 1; 
    Integer TWO = 2; 
    Integer OTHER_ONE = new Integer(1); 
    Integer OTHER_TWO = new Integer(2); 
    m1.put(ONE, new Object()); 
    m1.put(TWO, new Object()); 
    System.out.println(m1.keySet()); // [1, 2] 

    m1.remove(OTHER_ONE); // Does not remove 
    System.out.println(m1.keySet()); // [1, 2] 

    m1.remove(ONE); // Does remove 
    System.out.println(m1.keySet()); // [2] 

    m1.keySet().removeAll(Arrays.asList(OTHER_TWO)); // ... 
    System.out.println(m1.keySet()); // [] WHAT? 
} 

這裏IdentityHashMap.keySet()爲什麼IdentityHashMap.keySet()。removeAll(keys)不使用標識?這是一個錯誤嗎?

參考,我發現在源代碼中的答案(見下文),但我不知道的根本原因。這是一個錯誤嗎?

+3

請參閱http://stackoverflow.com/questions/2021374/boxed-primitives-and-equivalence/2021442。 – Danstahr

+2

Danstahr我知道。我有意使用新的Integer()來測試地圖的身份行爲。我在詢問removeAll。問題不清楚嗎?謝謝。 – aalku

回答

1

我1.7.0_11

​​

它使用c.contains()這樣的行爲依賴於集合類中找到這個源代碼與Java。我不明白從javadoc。

我發現它是一個6年前報告的錯誤,仍然沒有解決! http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6588783

+0

這個答案中有一個問題,所以也許將它合併到原始問題中。 – siledh

+0

完成。謝謝。 – aalku

-1

試試這個。它將說明發生了什麼。

System.out.println(OTHER_ONE == ONE); 
    System.out.println(Arrays.asList(OTHER_ONE).contains(ONE)); 

OTHER_ONE是將在堆內存中的對象。 ONE不是一個對象,因此它駐留在常量池內存中。

如果你用new keyword創建包裝對象,那麼只有它會去堆內存,否則它會保存在常量池中。

+0

它是一個對象。 – aalku

+0

爲什麼要投票?頭腦解釋 – Prabhakaran

+0

因爲這不是問題的關於 – siledh

相關問題