天天看點

集合轉數組

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的情況