3

我有一个List<String>Java,想把它转换成一个数组。

起初,我使用将数组作为输入的 toArray 语法,但后来我切换到无参数版本,即我从:

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

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

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

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

谢谢!

4

3 回答 3

9

toArray()返回 an Object[],而不是 a String[](请记住:Java 中的泛型通过类型擦除工作,因此 anArrayList<String>实际上可以包含 a Number),因此会出现动态转换错误(aka ClassCastException)。

常用的方法toArray(…)是传递一个适当大小的数组,因此不需要重新分配:

String[] myArray = myList.toArray(new String[myList.size()]);
于 2013-02-20T17:42:22.463 回答
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 */
于 2013-02-20T17:43:56.280 回答
0

在java 8中,可以通过

String[] myArray = myList.stream().toArray(String[]::new)
于 2018-09-19T12:51:26.090 回答