關於Java.util包中的Arrays的源碼探索

List<Integer> list = Arrays.asList(1,2,3);
 Integer[] array =new Integer[1];//長度爲1 <list.size
 Integer[] integers = list.toArray(array);
 System.out.println(Arrays.toString(array));
 System.out.println(Arrays.toString(integers));
 System.out.println(array == integers);
 Integer[] is = new Integer[]{1};
 Integer[] is1 = new Integer[]{1};
 System.out.println(is == is1);

輸出結果:

[null]
[1, 2, 3]
false
false


List<Integer> list = Arrays.asList(1,2,3);
 Integer[] array =new Integer[4];//長度4  >list.size
 Integer[] integers = list.toArray(array);
 System.out.println(Arrays.toString(array));
 System.out.println(Arrays.toString(integers));
 System.out.println(array == integers);//這一行,實際上證明了,參數array,和copy方法返回的數組引用指向的是同一個數組對象。內存地址相同。

輸出結果:

[1, 2, 3, null]
[1, 2, 3, null]
true
false

以上是我編寫的代碼測試

通過源碼可以看出來,toarray()是直接返回object數組,但是不能強轉成我們要的類型:

這樣寫是錯的,Integer[] ins = (Integer[])toarray();

我們可以使用

<T> T[] toArray(T[] a);指定類型

源碼顯示,如果指定的數組長度小於list.size,直接返回一個list對應的類型的,長度爲size,元素爲list元素的新的copy,實際上就是原封不動的產生了一個新的數組,只不過比toarray()多了類型,不是object[]

如果指定的數組長度>list.size 那麼,源碼顯示 調用的是

System.arraycopy(elementData, 0, a, 0, size);//調用system.arraycopy進行復制,源碼註釋可以看出每個參數的意思,分別是原始數據,copy的起始位置,新的數組,copy開始的位置,總共copy的長度
if (a.length > size)
    a[size] = null;//數組長度4,list.size=3,數組還有位置,多出來的位置往後都賦值爲null,並返回這個數組

return a;//返回數組對象的地址引用

除此之外,Arrays裏面還有很多實用的方法,sort方法重載(可以自定義排序規則),asList轉集合

除此之外,java.util裏面還有很多的實用類,包括function包下面的consumer,用於lambada方法

Consumer<Integer> consumer = x->{
    System.out.println(x);
  // if(x>2){  做一些操作
       //list2.add(x);//
  // }
};
list.forEach(consumer);//這裏相當與把for循環裏做的判斷和一些操作全部放入consumer,然後consumer作爲條件傳入

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章