Java ConcurrentSkipListMap кетсета для массива

Я пытаюсь использовать следующую строку, чтобы получить массив ключей из ConcurrentSkipListMap:

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

Но это не сработало, все элементы в массиве результатов одинаковы, почему?

2 ответа

Решение

Это работает как ожидалось:

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 будет содержать нулевые элементы

Так что, вероятно, имеет смысл сохранить звонок 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]

Другие вопросы по тегам