1)ArrayList.toArray()推薦有參數,還是無參數,為什麼?
推薦有參數 無參的方法傳回值是Object[],傳入構造的也是Object[],
傳回值直接用别的類型的接受有可能報ClassCastException異常
eg:
List list = new ArrayList(2);
list.add(8L);
list.add(5L);
Long[] array = new Long[list.size()];
// Long[] objects =(Long[] ) list.toArray();//報錯
list.toArray(array);//不報錯
2)如果有參數,那麼參數的數組長度是多少?給出分析的邏輯思考。注意:《阿裡巴巴JAVA開發手冊》在這一點上,有可能是描述錯誤的。
jdk1.8
//有參數
public 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);
//數組長度>集合長度 ,将集合裡的元素直接進行拷貝,多餘的元素指派為null。
if (a.length > size){
a[size] = null;
return a;
}
}
//無參
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
//有參和無參共同調用的copyOf 方法
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength] // 類型相同,則重新生成一個大小為newLength的數組執行個體
: (T[]) Array.newInstance(newType.getComponentType(), newLength); // 類型不同,重新生成一個大小為 newLength的新類型數組執行個體
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); //将原數組内容拷貝到新數組中,新數 組取最小的數組長度
return copy; // 傳回新數組的引用
總結:
1 .數組長度>=集合長度,直接拷貝,不會産生新的數組對象;
2.數組長度<集合長度,會建立一個與集合長度相同的新數組,将集合的資料拷貝到新數組并将新數組的引用傳回。
最好是數組的長度和集合長度相等,這樣就不存在擴容問題,節省空間,get取值也不會存在Null的情況