![](/img/trans.png)
[英]java: (String[])List.toArray() gives ClassCastException
[英]Convert list of strings to array of strings - difference between (String[])list.toArray() and list.toArray(new String[0])
我在Java中有一個List<String>
,並希望將其轉換為數組。
起初,我使用了toArray語法,它將一個數組作為輸入,但后來切換到無參數版本,即我從:
String[] myArray = myList.toArray(new String[0]);
至
String[] myArray = (String[])myList.toArray();
閱讀文檔 (我的基礎類型是ArrayList),似乎功能應該是相同的。 我認為后一版本效率更高,因為它不需要分配和收集一個空數組。 我錯過了任何微妙的差異嗎?
(注意:我問的原因是GWT確實以不同的方式處理語句。后者給出了動態轉換錯誤而前者沒有。我只是想知道這是否是我如何使用GWT的一個細微差別我如何使用Java的細微差別。)
謝謝!
toArray()
返回一個Object[]
,而不是String[]
(請記住:Java中的泛型按類型擦除工作,因此ArrayList<String>
實際上可以包含一個Number
),因此動態轉換錯誤 (又稱ClassCastException
)。
使用toArray(…)
的常用方法是傳遞適當大小的數組,因此不需要重新分配:
String[] myArray = myList.toArray(new String[myList.size()]);
在您的示例中,由於您指定的原因,選項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 */
在java 8中,它可以通過實現
String[] myArray = myList.stream().toArray(String[]::new)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.