3

有人可以解释为什么以下原因:

Integer[] arr1 = {1,2,3,4,5};
Collection<?> numbers = Arrays.asList(new Integer[]{1,2,3});
System.out.println(Arrays.asList(arr1).containsAll(numbers));

打印“true”,而如果我们像这样将 Integer 交换为 int:

int[] arr2 = {1,2,3,4,5};
Collection<?> numbers2 = Arrays.asList(new int[]{1,2,3});
System.out.println(Arrays.asList(arr2).containsAll(numbers2));

打印“假”?

4

3 回答 3

9

在第二种情况下,每个列表都包含一个元素。这两个元素都是 int[] 数组。包含较大数组的列表不包含包含较小数组的列表的成员。

Arrays.asList() 方法接受类型为 T 的参数的可变参数列表,并返回一个List<T>. 使用 Integer 数组,T 可以是 Integer,返回类型是 List。但是对于原始数组,T 不能是 int,因为不能有List<int>.

于 2013-05-03T23:29:08.603 回答
0

List 是对象的集合,如果您将对象放入其中,它会非常有用。当您尝试使用原始数组创建列表时,JVM 不会抛出异常,但它无法按照您的需要创建列表。因此,当您使用有效的整数数组创建列表时,当您使用语法正确但逻辑上违反集合原则的 int 数组创建列表时,您会看到输出的差异。

于 2013-05-03T23:37:47.730 回答
-1

据此:Java和C#中的int和Integer有什么区别?

Integer 是 Object 而 int 是原始类型,但它们并不直接相同......

因此,在 Java 文档中, Collection.containsAll(Object o) 需要一个 Object 而不是原语。也许这解释了不同的

http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

非常感谢您的提问。

于 2013-05-03T23:35:18.010 回答