Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,整数不是唯一的,但它们在集合中如何比较?_Java_Collections_Autoboxing - Fatal编程技术网

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

Java,整数不是唯一的,但它们在集合中如何比较?,java,collections,autoboxing,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"); 包含不按引用进行比较newinteger(50000)与另一个对newinteger(

我使用了这种直接的方法:

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

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

在执行装箱时,0-127将被放入固定池中,但在显式创建新对象时不会,因此您将对同一个值具有相同的引用,但除此之外,您无法保证任何内部调用,并且对于同一个值,引用可能是对不同整数对象的引用
Integer.valueOf(
将在适当的情况下尝试实习,即始终在
[-128,128)
范围内,并且没有规定在该范围外实习或不实习

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

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

技术上:

如果此集合包含指定的元素,则返回
true
。详细信息 形式上,返回
true
当且仅当此集合包含 至少一个元素e,使得
(o==null?e==null:o.equals(e))

定义如下:

如果此集合包含指定的元素,则返回
true
。详细信息 形式上,返回
true
当且仅当此集合包含 至少一个元素e,使得
(o==null?e==null:o.equals(e))

换句话说:如果
o
null
,则如果集合包含
null
元素,contains将返回
true
,否则它将返回
true
当且仅当存在
等于()的元素时(
您正在搜索的元素)

每次调用
新整数(5)
都将返回不同的引用,但根据以下条件,所有对象都是相等的:

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

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

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

但是,对于您拥有的自定义对象(例如Person),情况可能并非如此

现在开始收集

Collection<Person> aCollection = Arrays.asList(b,c,d);
    Person a = new Person("Abhishek");
Collection aCollection=Arrays.asList(b,c,d);
人a=新人(“阿披实”);

可能返回false。因为您尚未重写.equals()Person类中的方法自动装箱是Java编译器在基元类型及其相应的对象包装类之间进行的自动转换。例如,将int转换为整数,将double转换为double,等等。如果转换方向相反,则称为取消装箱


您可以通过查看源代码来解决此类疑问。“0-127将被放入一个固定池中,因此您将对相同的值有相同的引用…”不是在您显式调用
new Integer(5)
@jlordo”时,但除此之外,您无法保证任何内部调用,并且引用可能不同现在好多了?我已经编辑了我的评论,它还不正确。你有一个矛盾:“0-127将被放入一个固定池中,因此你将对相同的值有相同的引用……而引用可能不同。”@jlordo我可能遗漏了一些东西,但我看不到矛盾。对于0-127,会发生interning,引用是相同的。在这上面,引用指向相同值的不同对象。正如我在第一条注释中所说的。当显式调用
新整数(5)时
您将获得对新对象的引用,而不是对内部对象的引用。好的,新整数(3)!=新整数(3)和(新整数(3))。等于(新整数(3))。集合与等于进行比较。
boolean contains(Object o)
Collection<Person> aCollection = Arrays.asList(b,c,d);
    Person a = new Person("Abhishek");