Arrays.asList的源碼解析

在日常開發中我們經常把數組轉換成list類型,使用到的方法是java.util.Arrays.asList();

但是可能出現的一個問題是結果不是如我們所期盼的,比如以下代碼:

int[] array = { 1, 2, 3 };
List list = Arrays.asList(array);
System.out.println(list.size());

可能很多朋友都覺得這個list的size是等於array的數組長度,可是輸出結果並非是3,而是1

並且輸出這個長度爲1的list的值,發現是一個對象。

我們查閱源碼:

public static <T> List<T> asList(T... a)

發現參數類型爲T,而T代表的是數組中元素的class。

我們知道對象都有class 屬性,這個屬性代表了類型本身。

而原生數據類型,比如int,long等,是沒有這個屬性的,具有class屬性的是其對應的包裝類Integer,Long。

這個時候int不存在class屬性,所以傳入的對象變成了數組本身而非數組中的元素。

解決方案(使用包裝類型的數組):

Integer[] array = { 1, 2, 3 };
List list = Arrays.asList(array);
System.out.println(list.size());

同時Java8提供了一個方法:

Integer[] array = { 1, 2, 3 };
List list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list.size());

具體代碼意義可以度娘java8新特性,這裏就不展開了。

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