将字符串列表转换为字符串数组 - (String [])list.toArray()和list.toArray(new String [0])之间的区别

时间:2013-02-20 17:25:05

标签: java gwt

我在Java中有一个List<String>,并希望将其转换为数组。

首先,我使用了toArray语法,它将数组作为输入,但后来切换到无参数版本,即我来自:

String[] myArray = myList.toArray(new String[0]);

String[] myArray = (String[])myList.toArray();

通过documentation(我的基础类型是ArrayList)读取,似乎功能应该是相同的。我认为后一版本效率更高,因为它不需要分配和收集一个空数组。我错过了任何微妙的差异吗?

(注意:我问的原因是GWT确实以不同的方式对待语句。后者给出了动态的强制转换错误而前者没有。我只是想知道这是否是我使用的细微差别GWT或我如何使用Java的细微差别。)

谢谢!

3 个答案:

答案 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)