Java 原始数组 List.contains 没有按预期工作
Java primitive array List.contains does not work as expected
为什么当我使用这段代码时,
int[] array = new int[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;
System.out.println(Arrays.asList(array).contains(1));
它输出错误。但是当我使用这段代码时,
Integer[] array = new Integer[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;
System.out.println(Arrays.asList(array).contains(1));
它输出 true?
Arrays.asList(array)
将 int[]
转换为具有单个元素(输入数组)的 List<int[]>
。因此该列表不包含 1.
另一方面,System.out.println(Arrays.asList(array).contains(array));
将为第一个代码片段打印 true。
Arrays.asList(int[])
将 return 变成 List<int[]>
,这就是输出为 false
.
的原因
此行为的原因隐藏在 Arrays.asList()
方法的签名中。这是
public static <T> List<T> asList(T... a)
可变参数在内部是一个对象数组(不是类型T
)。但是,int[]
不符合此定义,这就是为什么 int[]
被视为一个单独的对象。
同时,Integer[]
可以被视为类型T
的对象数组,因为它由对象(但不包括基元)组成。
为什么当我使用这段代码时,
int[] array = new int[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;
System.out.println(Arrays.asList(array).contains(1));
它输出错误。但是当我使用这段代码时,
Integer[] array = new Integer[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;
System.out.println(Arrays.asList(array).contains(1));
它输出 true?
Arrays.asList(array)
将 int[]
转换为具有单个元素(输入数组)的 List<int[]>
。因此该列表不包含 1.
另一方面,System.out.println(Arrays.asList(array).contains(array));
将为第一个代码片段打印 true。
Arrays.asList(int[])
将 return 变成 List<int[]>
,这就是输出为 false
.
此行为的原因隐藏在 Arrays.asList()
方法的签名中。这是
public static <T> List<T> asList(T... a)
可变参数在内部是一个对象数组(不是类型T
)。但是,int[]
不符合此定义,这就是为什么 int[]
被视为一个单独的对象。
同时,Integer[]
可以被视为类型T
的对象数组,因为它由对象(但不包括基元)组成。