0

次の行を使用して、 ConcurrentSkipListMap からキーの配列を取得しようとしています:

myArray=(String[])myMap.keySet().toArray(new String[myMap.size()]);

しかし、うまくいきませんでした。結果配列のすべての項目が同じです。なぜですか?

4

2 に答える 2

1

これは期待どおりに機能します。

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]

これはアトミックではないことに注意してください。マップが と の呼び出しの間に変更された場合sizetoArray次のことが起こります。

  • 新しいマップが小さい場合、myArray作成した配列よりもサイズが大きくなりますnew String[myMap.size()]
  • 新しいマップが大きい場合、myArraynull アイテムが含まれます

sizeしたがって、この場合、呼び出しを保存して (おそらく) 不必要な配列の作成を回避し、単純に使用することはおそらく理にかなっています。

String[] myArray= myMap.keySet().toArray(new String[0]);
于 2013-07-24T17:20:23.130 に答える
1

これを試すことができます:

    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]

于 2013-07-24T17:22:30.180 に答える