我对以下代码有疑问:
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
}
结果输出让我感到惊讶:
false
true
我已经在线检查了Javadoc中的构造函数,没有任何帮助。
提前致谢
谢谢
答案 0 :(得分:4)
您应该使用equals
来检查值的相等性。因为Integer是包装int值的包装类。 ==
根据引用检查相等性,因此在这两种情况下,您的引用都不同。
将此对象与指定对象进行比较。当且仅当参数不为null并且是包含与此对象相同的int值的Integer对象时,结果才为真。
n1.equals(n2);
如果你这样做
int n1 = new Integer(47);
int n2 = new Integer(47);
您将获得您期望的输出。
因为Java维护从127
到-128
的整数池,所以你也可以这样做
Integer n1 = Integer.valueOf(47);
Integer n2 = Integer.valueOf(47);<-- will return you the same reference
n1==n2 >>> True
答案 1 :(得分:3)
只能将原始类型与==
进行可靠的比较。对于对象(Integer
是对象类型),应使用equals()
方法。
==
可用于对象,但仅用于检查两个对象实际上是否相同。例如:
Integer n1 = new Integer(47);
Integer n2 = n1;
// n1 == n2 will be true
最好将int
s视为数字本身,将Integer
视为带有写在其上的数字的便利贴。 ==
只会在您正在讨论相同的便利贴时返回true,equals()
但对于任何两个带有相同编号的笔记,它都会返回true。
问题的复杂性在于,由于1.5版Java也有autoboxing,即int
s会在需要时自动转换为Integer
,反之亦然。如果你不小心,这会导致非常令人惊讶的结果。
答案 2 :(得分:1)
n1 == n2
,比较对象实例,因此n1 == n2
将返回false
而n1 != n2
将返回true
为{{ 1}}和n1
不是同一个对象实例。
如果您使用n2
方法或获取equals
值,然后使用int (primitive tpye)
进行比较,您将得到正确的结果,例如
== or !=
或
System.out.println(n1.equals(n2)); //true
System.out.println(!n1.equals(n2));//false
答案 3 :(得分:1)
我相信这是因为你没有比较你正在比较对象参考的n1和n2的值。由于它们是两个不同的对象,它们的引用并不相同。
因此,您应该使用equals()方法来比较它们的值
答案 4 :(得分:1)
java.Lang.Integer
是java中的object
。你应该检查两个Integer对象是否等于使用equals()
方法
您正在检查n1对Integer对象的引用和对另一个Integer对象的n2引用是否引用相同的Integer对象。因为==
运算符检查两个引用变量是否引用同一个对象。在这种情况下,他们不是。
试试
Integer n1 = New Integer(47);
Integer n2 = New Integer(47);
System.out.println(n1.equals(n2));
System.out.println(n1.equals(n2));