如何将Set <String>转换为String []?

sut*_*ter 269 java

我需要得到一个String[]出来的Set<String>,但我不知道该怎么做.以下失败:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
Run Code Online (Sandbox Code Playgroud)

我该如何修复以使其有效?

Bal*_*usC 452

使用该Set#toArray(T[])方法采用相同大小的类型化数组参数.

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);
Run Code Online (Sandbox Code Playgroud)

也可以使用不同的大小,但这会强制该toArray()方法创建一个新的数组来返回而不是重用所提供的参数,这可能最终效率较低.

另见源代码AbstractCollection#toArray().

  • 从Java 7我们可以使用`String [] GPXFILES1 = myset.toArray(new String [0])`,这是推荐的.更新答案."由于OpenJDK 6的最新更新,这个调用是内在化的,与预先调整大小的版本相比,使得空数组版本的性能相同,有时甚至更好.同样,传递预先调整大小的数组对于并发或同步集合是危险的.如果集合在操作期间同时收缩,则size和toArray调用之间可能存在数据争用,这可能导致数组末尾出现额外的空值." - 由java社区引用. (5认同)
  • 首先遇到这个答案,然后做更多的研究,有一些证据支持上述评论是正确的; 并且接受的答案已经过时了.请参考以下示例链接:/sf/ask/690461971/,以及来自该SO的链接https: //shipilev.net/blog/2016/arrays-wisdom-ancients/. (4认同)
  • 你也可以指定大小为0的数组:`String [] GPXFILES1 = myset.toArray(new String [0]);` (3认同)

i_a*_*ero 55

Java 11

接口中的新默认toArray方法Collection允许将集合的元素传输到新创建的所需运行时类型的数组.需要IntFunction<T[]> generator作为参数,可作为:

 String[] array = set.toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

已经存在类似的方法,Collection.toArray(T[])并且这种添加意味着我们不再能够传递,null因为该方法的引用将是模糊的.但它仍然没问题,因为无论如何这两种方法都会抛出NPE.

Java 8

在Java 8中,我们可以使用流API:

String[] array = set.stream().toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

我们还可以使用toArray()的重载版本,其中IntFunction<A[]> generator包含:

String[] array = set.stream().toArray(n -> new String[n]);
Run Code Online (Sandbox Code Playgroud)

这里生成器函数的目的是取整数(所需数组的大小)并生成所需大小的数组.我个人更喜欢使用方法引用的前一种方法而不是后一种使用lambda表达式的方法.


JMe*_*nik 39

使用 toArray(T [] a)方法:

String[] array = set.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

  • 当你传递toArray()一个太小的数组时,toArray()方法必须使用反射构造一个正确大小的新数组.这比传递至少是集合本身大小的数组的性能要差得多.因此,`[0]`应该被替换为`[myset.size()]`,就像在接受的答案中一样. (25认同)
  • @ k2col似乎现在`set.toArray(new String [0])`的性能比`set.toArray(new String [set.size()]更好 (8认同)
  • 总是想知道为什么String [0]工作而不是大小 (2认同)

小智 5

番石榴风格:

Set<String> myset = myMap.keySet();
FluentIterable.from(mySet).toArray(String.class);
Run Code Online (Sandbox Code Playgroud)

更多信息:https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html