我在Java中有一个List<String>
,并希望将其转换为数组。
首先,我使用了toArray语法,它将数组作为输入,但后来切换到无参数版本,即我来自:
String[] myArray = myList.toArray(new String[0]);
到
String[] myArray = (String[])myList.toArray();
通过documentation(我的基础类型是ArrayList)读取,似乎功能应该是相同的。我认为后一版本效率更高,因为它不需要分配和收集一个空数组。我错过了任何微妙的差异吗?
(注意:我问的原因是GWT确实以不同的方式对待语句。后者给出了动态的强制转换错误而前者没有。我只是想知道这是否是我使用的细微差别GWT或我如何使用Java的细微差别。)
谢谢!
答案 0 :(得分:9)
toArray()
返回Object[]
,而不是String[]
(请记住:Java工作中的泛型按类型擦除,因此ArrayList<String>
实际上可以包含Number
}),因此动态投射错误(又名ClassCastException
)。
使用toArray(…)
的常用方法是传递适当大小的数组,因此不需要重新分配:
String[] myArray = myList.toArray(new String[myList.size()]);
答案 1 :(得分:1)
在您的示例中,由于您指定的原因,选项2的效率会略高一些。
String[] myArray = myList.toArray(new String[0]); /* option 1 */
String[] myArray = (String[])myList.toArray(); /* option 2 */
还有第三个选项可以避免任何不必要的分配,并避免选项2中潜在的转换问题:
String[] myArray = myList.toArray(new String[myList.size()]); /* option 3 */
答案 2 :(得分:0)
在Java 8中,可以通过以下方式实现
String[] myArray = myList.stream().toArray(String[]::new)