ChatGPT還是有點東西的-public static <T> List<T> Arrays.asList(T... a) {...}

背景

業務開發需要判斷業務狀態是否在30、40、50、60的集合內,所以寫了以下代碼

int[] inLiq = {30,40,50,60};
return Arrays.asList(inLiq).contains(o.getOrderStatus());

自我Review代碼時,驗證了下這行代碼,發現狀態爲30時,仍然返回false。
在自我懷疑中調整代碼,並驗證,代碼如下:

Integer[] integerArray = {30, 40, 50,60};
List<Integer> integerList = Arrays.asList(integerArray);
System.out.println(integerList.contains(30)); // true
System.out.println(integerList.contains(Integer.valueOf(30))); // true
System.out.println(integerList.contains(Integer.valueOf(30).intValue())); // true


int[] intArray = {30, 40, 50,60};
List<int[]> intList = Arrays.asList(intArray);
System.out.println(intList.contains(30)); // false
System.out.println(intList.contains(Integer.valueOf(30))); // false
System.out.println(intList.contains(Integer.valueOf(30).intValue())); // false

沒想很明白,於是問了下ChatGPT。

ChatGPT的回答

Arrays.asList() 方法返回的結果類型取決於傳入的參數類型。讓我們來看一下這兩個情況。

在第一種情況下,integerArray 是一個包裝類型(Integer)的數組。當你將它作爲參數傳遞給 Arrays.asList() 方法時,它會將數組的元素視爲獨立的對象,並返回一個泛型爲 Integer 的 List。也就是說,它會將數組中的每個元素轉換爲相應的 Integer 對象,並將這些對象放入列表中。

Integer[] integerArray = {30, 40, 50, 60};
List<Integer> integerList = Arrays.asList(integerArray);

在這種情況下,integerList 是一個泛型爲 Integer 的列表,可以通過索引訪問、迭代等操作。

而在第二種情況下,intArray 是一個基本類型(int)的數組。當你將它作爲參數傳遞給 Arrays.asList() 方法時,由於基本類型不能作爲泛型參數,它會將整個數組作爲單個元素放入列表中。也就是說,返回的是一個 List<int[]>,其中的元素類型是 int[]。

int[] intArray = {30, 40, 50, 60};
List<int[]> intList = Arrays.asList(intArray);

在這種情況下,intList 是一個泛型爲 int[] 的列表,它包含了一個元素,即原始的 int 數組。因此,你無法通過索引訪問數組的元素,而只能通過 intList.get(0) 訪問整個數組。

總結來說,Arrays.asList() 方法根據傳入的參數類型決定返回的結果類型,基本類型數組會被視爲單個元素放入列表中,而包裝類型數組會將每個元素都作爲獨立對象放入列表中。

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