-
toArray
鎖定
- 中文名
- toArray
- 涉及學科
- 數據結構
- 類 型
- 函數
- 目 標
- 獲得一個實際的數組
- 母函數
- ArrayList
- 語 種
- JAVA
函數用法
可以通過調用方法toArray()來實現。
示例:
package bo; import java.util.ArrayList; public class ToArrayTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Integer> al = new ArrayList<Integer>(); al.add(new Integer(1)); al.add(new Integer(2)); al.add(new Integer(3)); al.add(new Integer(4)); al.add(new Integer(5)); System.out.println("al中元素:" + al); //獲得數組 Object ia[] = al.toArray(); //遍歷數組 for(int i=0; i<ia.length; i++){ System.out.println(ia[i] + " "); } } }
運行結果:
al中元素:[1, 2, 3, 4, 5]
1
2
3
4
5
List提供了toArray()的方法,但是要使用不好,就會有ClassCastException異常究竟這個是如何產生的,且看代碼:
首先咱們來看看下面的代碼:
ArrayList<String []> arr = new ArrayList<String []>(); arr.add(new String[]{"a","b"}); arr.add(new String[]{"c","d"}); String [][] str_a = (String[][]) arr.toArray();//這幾行代碼會有ClassCastException異常
執行上面這幾行代碼 會有ClassCastException異常
咱們再來看下面幾行代碼:
ArrayList<String []> arr = new ArrayList<String []>(); arr.add(new String[]{"a","b"}); arr.add(new String[]{"c","d"}); String [][] str_a = (String[][]) arr.toArray(new String[0][0]);
執行上面的代碼就完全OK了
會拋java.lang.ClassCastException。
public Object[] toArray() { return Arrays.copyOf(elementData, size); } 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()方法,是構造的一個Object數組,然後進行數據copy,此時進行轉型就會產生ClassCastException
而帶參數的toArray(T[] a) 方法,則是根據參數數組的類型,構造了一個對應類型的,長度跟ArrayList的size一致的空數組,雖然方法本身還是以 Object 數組的形式返回結果,不過由於構造數組使用的ComponentType跟需要轉型的ComponentType一致,就不會產生轉型異常
正確的方式
1. String[][] str_a = (String [][]) arr.toArray(new String[0][0]); 2. String[][] a = new String[<size>][size]; String [][] str_a = (String [][]) arr.toArray(a);
這裏要注意的是:你要是傳入的參數為9個大小,而list裏面有5個 object ,那麼其他的四個會是 null , 使用的時候要注意。