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作爲條件傳入