我正试图使用以下行从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
将包含空项
因此,在这种情况下,保存对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]