次の行を使用して、 ConcurrentSkipListMap からキーの配列を取得しようとしています:
myArray=(String[])myMap.keySet().toArray(new String[myMap.size()]);
しかし、うまくいきませんでした。結果配列のすべての項目が同じです。なぜですか?
次の行を使用して、 ConcurrentSkipListMap からキーの配列を取得しようとしています:
myArray=(String[])myMap.keySet().toArray(new String[myMap.size()]);
しかし、うまくいきませんでした。結果配列のすべての項目が同じです。なぜですか?
これは期待どおりに機能します。
Map<String, String> myMap = new ConcurrentSkipListMap<>();
myMap.put("a", "b");
myMap.put("b", "c");
String[] myArray= myMap.keySet().toArray(new String[myMap.size()]);
System.out.println(Arrays.toString(myArray));
そして出力:
[a, b]
これはアトミックではないことに注意してください。マップが と の呼び出しの間に変更された場合size
、toArray
次のことが起こります。
myArray
作成した配列よりもサイズが大きくなりますnew String[myMap.size()]
myArray
null アイテムが含まれますsize
したがって、この場合、呼び出しを保存して (おそらく) 不必要な配列の作成を回避し、単純に使用することはおそらく理にかなっています。
String[] myArray= myMap.keySet().toArray(new String[0]);
これを試すことができます:
ConcurrentSkipListMap myMap = new ConcurrentSkipListMap();
myMap.put("3", "A");
myMap.put("2", "B");
myMap.put("1", "C");
myMap.put("5", "D");
myMap.put("4", "E");
Object[] myArray = myMap.keySet().toArray();
System.out.println(Arrays.toString(myArray));
結果は次のようになります。
[1、2、3、4、5]