Collection的toArray()使用上需要注意的地方

Collection在很多情況下需要轉換爲數組來處理(很多接口方法都使用array作爲參數)。
Collection的toArray()方法返回的Object[],是不能被強制轉換爲子元素類型的
例如:

Java代碼
  1. List l=new ArrayList();   
  2. l.add("a");   
  3. l.add("b");   
  4. String[] strs=(String[])l.toArray();//throw ClassCastException  
List l=new ArrayList();
l.add("a");
l.add("b");
String[] strs=(String[])l.toArray();//throw ClassCastException


通常的做法是:

Java代碼
  1. String[] strs=new String[l.size()];   
  2. l.toArray(strs);  
String[] strs=new String[l.size()];
l.toArray(strs);


toArray(T[] a)方法有個比較怪異的地方:

Java代碼
  1. List l=new ArrayList();      
  2. l.add("a");      
  3. l.add("b");      
  4. String[] strs=new String[4];//比List多2個元素      
  5. for(int i=0;i<strs.length;i++){//填充4個字符串"x”      
  6.      strs[i]="x";      
  7. }      
  8. String[] newStrs=(String[]) l.toArray(strs);   
  9. System.out.println(newStrs==strs);//爲了確定是否傳入的參數對象和返回的是同一個對象。   
  10. for(int i=0;i<strs.length;i++){      
  11.    System.out.println(strs[i]);      
  12. }  
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文檔的說明:

引用
toArray
<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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章