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]