2

内部ではありますが、一般的にConcurrentIdentityWeakKeyHashMapを使用しても安全だと思いました。ただし、次のコード:

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

これは私の側のバグまたは誤解ですか(つまり、「整数で使用すべきではない」または「内部使用のみ」)?

編集: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)));
 }

今、それは動作します...

4

1 に答える 1

1

127までの整数はIntegerクラスに事前にキャッシュされているため、ガベージコレクションされることはありません。

于 2012-04-11T22:45:54.387 に答える