【问题标题】:Difference in containsAll behavior for Integer and int arrays (Java)Integer 和 int 数组的 containsAll 行为差异 (Java)
【发布时间】:2013-04-28 10:47:02
【问题描述】:

有人能解释一下为什么吗:

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));

“假”打印出来了?

【问题讨论】:

    标签: java collections wrapper primitive


    【解决方案1】:

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

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

    【讨论】:

    • 我还想指出,即使在将较小的数组 {1,2,3} 替换为 {1,2,3,4,5} 和 true 后,在第二种情况下仍然会出现错误仅当两个列表中的数组通过引用比较相同时(即“==”)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      据此:What is the difference between an int and an Integer in Java and C#?

      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)

      非常感谢您的提问。

      【讨论】:

        猜你喜欢
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 2022-07-25
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多