2012-04-11 66 views
2

雖然內部,我推測一般使用ConcurrentIdentityWeakKeyHashMap是安全的。但是,下面的代碼:ConcurrentIdentityWeakKeyHashMap和Integer鍵

ConcurrentIdentityWeakKeyHashMap map = new ConcurrentIdentityWeakKeyHashMap(); 
for(int key = 0; key < 132; key++){ 
    map.put(key, key); 
} 
for(int key = 0; key < 132; key++){ 
    System.out.println(map.get(key)); 
} 

生產:

0 
1 
.. 
124 
125 
126 
127 
null 
null 
null 
null 

這是(即「不應與使用整數」或「僅供內部使用」)中的錯誤或在我身邊一個誤解?

編輯:基於盧西亞諾的意見,我改變了代碼一點,以使其保持在一個參考(我希望至少)非常相同的整數列表和地圖:

ArrayList<Integer> list = new ArrayList<Integer>(132); 
ConcurrentIdentityWeakKeyHashMap<Integer, Integer> map = new ConcurrentIdentityWeakKeyHashMap<Integer, Integer>(); 
for(int key = 0; key < 132; key++){ 
    Integer key2 = key; 
    list.add(key2); 
    map.put(key2, key2); 
} 
for(int key = 0; key < 132; key++){ 
    System.out.println(map.get(list.get(key))); 
} 

現在,它的工作原理...

回答

1

Integer最多可以在Integer類中預先存儲127個,所以它們永遠不會被垃圾收集。

+0

好的,那麼有什麼意義呢?你的意思是說,鍵值高達127的數值從未被GCC控制過,並且所有上面的數據都會立即被GCed? – user462982 2012-04-11 22:51:16

+0

此外,它使用標識(==)比較鍵,因此當您獲取(鍵)時,自動裝箱會使用鍵號創建一個新的Integer對象,但該對象與保存在Map上的對象不同,所以identity等於運算符返回false,因此您得到一個空值。 – Luciano 2012-04-11 22:59:28

相關問題