Java ConcurrentSkipListMap设置为数组

Java ConcurrentSkipListMap设置为数组,java,toarray,concurrentskiplistmap,Java,Toarray,Concurrentskiplistmap,我尝试使用以下行从ConcurrentSkipListMap获取一个密钥数组: myArray=(String[])myMap.keySet().toArray(new String[myMap.size()]); 但它不起作用,结果数组中的所有项都是相同的,为什么?这就像预期的那样起作用: Map<String, String> myMap = new ConcurrentSkipListMap<>(); myMap.put("a", "b"); myMap.put(

我尝试使用以下行从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));
请注意,这不是原子的,因此如果在调用
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]

如何声明映射,如何声明myArray?什么不起作用(编译器错误?异常?)?等
    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));