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 ...
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
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