2012-04-11 10 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 

が、これはバグや私の側の誤解です(つまり、「整数を使用すべきではありません」または「内部使用のみ」) ?

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

それは動作します...

答えて

1

Integerクラスで127までの整数がプリキャッシュされるため、ガベージコレクションされません。

+0

これでポイントは何ですか? 127までのキーを持つ値は決してGCedされず、上記のすべてが即時にGCedされると言っていましたか? – user462982

+0

また、identity(==)を使用してキーを比較するので、get(key)を実行するとオートボックスによってキー番号で新しいIntegerオブジェクトが作成されますが、そのオブジェクトはMapに保存されたものとは異なります。 identity equals演算子はfalseを返します。したがって、null値が返されます。 – Luciano

関連する問題