我使用了这种直截了当的方法:
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
答案 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))
。
单词:如果o
为null
,则如果集合包含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