轉載自:https://www.cnblogs.com/qianqian528/p/7985118.html
一直不太熟悉toarray()的用法 現整理如下
一.原因
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
String[] tt = (String[]) list.toArray(new String[0]);
}
這段代碼是沒問題的,但我們看到String[] tt =(String[]) list.toArray(new String[0]) 中的參數很奇怪,然而去掉這個參數new String[0]卻在運作時報錯.
二. 問題分析
經研究發現toArray有兩個方法:
2.1 普通toArray
public Object[] toArray() {
Object[] result = new Object[size];
System.arraycopy(elementData, 0, result, 0, size);
return result;
}
不帶參數的toArray方法,是構造的一個Object數組,然後進行資料拷貝,此時進行轉型就會産生ClassCastException,這也就是上述問題的root cause了。
2.2 帶參toArray
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
而帶參數的toArray方法,則是根據參數數組的類型,構造了一個對應類型的,長度跟ArrayList的size一緻的空數組,雖然方法本身還是以 Object數組的形式傳回結果,不過由于構造數組使用的ComponentType跟需要轉型的ComponentType一緻,就不會産生轉型異常。
3. 使用
是以在使用toArray的時候可以參考以下三種方式
1. Long[] l = new Long[<total size>];
list.toArray(l);
2. Long[] l = (Long[]) list.toArray(new Long[0]);
3. Long[] a = new Long[<total size>];
Long[] l = (Long[]) list.toArray(a);
------------------------
類如:
return (HttpHost[])hosts.toArray(new HttpHost[0]);