Collection在很多情況下需要轉換爲數組來處理(很多接口方法都使用array作爲參數)。
Collection的toArray()方法返回的Object[],是不能被強制轉換爲子元素類型的
例如:
- List l=new ArrayList();
- l.add("a");
- l.add("b");
- String[] strs=(String[])l.toArray();//throw ClassCastException
List l=new ArrayList();
l.add("a");
l.add("b");
String[] strs=(String[])l.toArray();//throw ClassCastException
通常的做法是:
- String[] strs=new String[l.size()];
- l.toArray(strs);
String[] strs=new String[l.size()];
l.toArray(strs);
toArray(T[] a)方法有個比較怪異的地方:
- List l=new ArrayList();
- l.add("a");
- l.add("b");
- String[] strs=new String[4];//比List多2個元素
- for(int i=0;i<strs.length;i++){//填充4個字符串"x”
- strs[i]="x";
- }
- String[] newStrs=(String[]) l.toArray(strs);
- System.out.println(newStrs==strs);//爲了確定是否傳入的參數對象和返回的是同一個對象。
- for(int i=0;i<strs.length;i++){
- System.out.println(strs[i]);
- }
List l=new ArrayList();
l.add("a");
l.add("b");
String[] strs=new String[4];//比List多2個元素
for(int i=0;i<strs.length;i++){//填充4個字符串"x”
strs[i]="x";
}
String[] newStrs=(String[]) l.toArray(strs);
System.out.println(newStrs==strs);//爲了確定是否傳入的參數對象和返回的是同一個對象。
for(int i=0;i<strs.length;i++){
System.out.println(strs[i]);
}
得到的結果是:
- true
- a
- b
- null
- x
JAVA API文檔的說明:
<T> T[] toArray(T[] a)返回包含此 collection 中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。如果指定的數組能容納該 collection,則返回包含此 collection 元素的數組。否則,將根據指定數組的運行時類型和此 collection 的大小分配一個新數組。
如果指定的數組能容納 collection 並有剩餘空間(即數組的元素比 collection 的元素多),那麼會將數組中緊跟在 collection 末尾的元素設置爲 null。(這對確定 collection 的長度很有用,但只有 在調用方知道此 collection 沒有包含任何 null 元素時纔可行。)
如果此 collection 對其迭代器返回的元素順序做出了某些保證,那麼此方法必須以相同的順序返回這些元素。
像 toArray 方法一樣,此方法充當了基於數組的 API 與基於 collection 的 API 之間的橋樑。更進一步說,此方法允許在輸出數組的運行時類型上進行精確控制,並且在某些情況下,可以用來節省分配開銷。
假定 l 是隻包含字符串的一個已知 List。以下代碼用來將該列表轉儲到一個新分配的 String 數組:
String[] x = (String[]) v.toArray(new String[0]);
注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。
參數:
a - 存儲此 collection 元素的數組(如果其足夠大);否則,將爲此分配一個具有相同運行時類型的新數組。
返回:
包含此 collection 元素的數組
拋出:
ArrayStoreException - 指定數組的運行時類型不是此 collection 每個元素運行時類型的超類型。
NullPointerException - 如果指定的數組爲 null。