背景
業務開發需要判斷業務狀態是否在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[] 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() 方法根據傳入的參數類型決定返回的結果類型,基本類型數組會被視爲單個元素放入列表中,而包裝類型數組會將每個元素都作爲獨立對象放入列表中。