-1

我使用了这种直截了当的方法:

    Collection<Integer> aCollection = Arrays.asList(1,2,3,4,5,6);
    Integer a = new Integer(5);

    if( aCollection.contains(a) )
        System.out.println("aCollection contains 5");

结果是“aCollection 包含 5”。整数不是整个系统中的唯一对象,但在这种情况下,“5”在Collection<Integer>new Integer(5)实际上是对同一个对象的引用吗?我可以安全地假设任何集合在调用时都会以这种方式运行.contains()吗?

我不确定,因为按==结果比较引用和值时:

3 == new Integer(3)
new Integer(3) != new Integer(3)
new Integer(3) == 3
4

4 回答 4

5

contains不按参考比较。new Integer(50000)不同于另一个调用new Integer(50000). 但是,firstInt.equals(new Integer(50000))将返回 true,因此 contains 将起作用。我使用较高的数字,因为实习可能发生在较低的数字上。

0-127 将在执行装箱时放入固定池中,但在显式创建新对象时不会放入,因此您将对相同值具有相同的引用,但在此之上,您不能保证任何实习,并且引用可能是相同值的不同 Integer 对象。Integer.valueOf(将尝试在适当的情况下进行实习,即始终在[-128, 128)此范围内且不指定或反对在此范围之外进行实习。

我可以安全地假设任何集合在调用时都会以这种方式运行.contains()吗?

您可以假设当且仅当集合的一个或多个成员满足,或者如果为 null 并且至少有一个成员时,.contains(Object o)它将返回。true thatmember.equals(o)onull

技术上:

返回true此集合是否包含指定元素。更正式地说,true当且仅当此集合包含至少一个元素 e 时才返回(o==null ? e==null : o.equals(e))

于 2013-09-02T09:10:23.707 回答
1

它在JavaDoc中定义:

boolean contains(Object o)

返回true此集合是否包含指定元素。更正式地说,true当且仅当此集合包含至少一个元素 e 时才返回(o==null ? e==null : o.equals(e))

换句话说:如果onull,包含将返回true如果集合包含一个null元素,则 contains 将返回,否则true当且仅当存在equals()您正在搜索的元素时才会返回。

每次调用new Integer(5)都会返回一个不同的引用,但根据equals()Integer将返回一个不同的引用,但根据类的方法,

将此对象与指定对象进行比较。结果是true当且仅当参数不是null并且是Integer包含与此对象相同的int值的对象。

于 2013-09-02T09:13:24.050 回答
0

.contains()集合在.equals()内部调用该方法。

在您的情况下,您使用的是 Integer 对象。在您列出的所有情况下,整数对象 .equals() 可能会返回 true。

但是,对于您所说的自定义对象来说,情况可能不是 Person。

现在收藏

Collection<Person> aCollection = Arrays.asList(b,c,d);
    Person a = new Person("Abhishek");

可能返回假。因为您没有覆盖 Person 类中的 .equals() 方法

于 2013-09-02T09:14:39.677 回答
0

自动装箱是 Java 编译器在原始类型与其对应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换以另一种方式进行,则称为拆箱。

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

于 2013-09-02T09:15:25.390 回答