Java ConcurrentSkipListMap ketset to array



我正试图使用以下行从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]

请注意,这不是原子性的,因此如果在调用sizetoArray之间修改映射,则会发生以下情况:

  • 如果新映射较小,则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]

相关内容

  • 没有找到相关文章

最新更新