2012-04-11 7 views
2

Obwohl intern, nahm ich an, dass es im Allgemeinen sicher ist, ConcurrentIdentityWeakKeyHashMap zu verwenden. Doch der folgende Code ein:ConcurrentIdentityWeakKeyHashMap und Integer-Schlüssel

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)); 
} 

produziert:

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

Ist das ein Fehler oder ein Missverständnis auf meiner Seite (dh oder „internal use only“ „sollte nicht mit ganzen Zahlen verwendet werden“) ?

EDIT: basierend auf Lucianos Kommentare, veränderte ich den Code ein wenig es einen Verweis auf das halten zu machen (ich zumindest hoffe) gleichen Integer in der Liste und in der Karte:

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))); 
} 

Jetzt , es funktioniert ...

Antwort

1

Integer bis zu 127 sind in der Integer-Klasse precached, so dass sie nie Müll gesammelt werden.

+0

OK, also was ist der Punkt dann? Solltest du sagen, dass Werte mit Schlüsseln bis zu 127 niemals gewertet werden und alles, was darüber liegt, sofort angezeigt wird? – user462982

+0

Es verwendet auch Identität (==), um Schlüssel zu vergleichen, wenn Sie also (Schlüssel) abrufen, erstellt das Autoboxing ein neues Integer-Objekt mit der Schlüsselnummer, aber dieses Objekt unterscheidet sich von dem auf der Karte gespeicherten identity = Operator gibt false zurück, daher erhalten Sie einen Nullwert. – Luciano

Verwandte Themen