Java,整数不是唯一的,但它们如何在集合中进行比较?

时间:2013-09-02 09:07:34

标签: java collections autoboxing

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

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

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

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

4 个答案:

答案 0 :(得分:5)

contains不能通过引用进行比较。 new Integer(50000)与对new Integer(50000)的另一次调用不同。但是,firstInt.equals(new Integer(50000))将返回true,因此包含将起作用。我使用更高的数字,因为实习可能发生在较低的数字上。

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

  

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

当且仅当集合中的一个或多个成员满足.contains(Object o)true时,您才可以认为thatmember.equals(o)将返回o }为null,并且至少有一个null成员。

技术上:

  

如果此集合包含指定的元素,则返回true。更多   正式地,当且仅当此集合包含at时返回true   至少一个元素e,(o==null ? e==null : o.equals(e))

答案 1 :(得分:1)

它在JavaDoc中定义:

boolean contains(Object o)
  

如果此集合包含指定的元素,则返回true。更多   正式地,当且仅当此集合包含at时返回true   至少一个元素e,(o==null ? e==null : o.equals(e))

单词:如果onull,则如果集合包含true元素,则contains将返回null,否则如果和{}返回true只有当你要搜索的元素equals()时才有。

每次调用new Integer(5)都会返回不同的引用,但根据equals() method of the Integer class所有对象彼此相等:

  

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

答案 2 :(得分:0)

集合的

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

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

然而,对于您说过Person的自定义对象可能不是这种情况。

现在收藏

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

可能会返回false。因为你没有覆盖Person类

中的.equals()方法

答案 3 :(得分:0)

Autoboxing是Java编译器在基元类型和相应的对象包装类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换采用另一种方式,则称为拆箱。

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