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
が、これはバグや私の側の誤解です(つまり、「整数を使用すべきではありません」または「内部使用のみ」) ?
EDIT:Lucianosのコメントに基づいて、私はそれは、リスト内のマップで(私は、少なくとも願って)非常に同じ整数への参照を保持するために、コードを少し変更:
今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)));
}
それは動作します...
これでポイントは何ですか? 127までのキーを持つ値は決してGCedされず、上記のすべてが即時にGCedされると言っていましたか? – user462982
また、identity(==)を使用してキーを比較するので、get(key)を実行するとオートボックスによってキー番号で新しいIntegerオブジェクトが作成されますが、そのオブジェクトはMapに保存されたものとは異なります。 identity equals演算子はfalseを返します。したがって、null値が返されます。 – Luciano