天天看點

java中toArray()的用法

轉載自: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]);