如果这是重复的,我会高兴地将其删除,但我无法找到它。
为什么第二次比较会返回false?感谢。
$ cat test.java
class test {
public static void main(String[] args) {
Integer num1 = new Integer(0);
Integer num2 = new Integer(0);
num1 = 1;
num2 = 1;
if (num1 == num2) {
System.out.println("Numbers are equal");
}
num1 = 128;
num2 = 128;
if (num1 == num2) {
System.out.println("Numbers are equal using == ");
}
if (num1.equals(num2)) {
System.out.println("Numbers are equal using .equals");
}
}
}
$ javac test.java
$ java test
Numbers are equal
Numbers are equal using .equals
答案 0 :(得分:4)
在Java中,Integers
应使用equals()
进行比较,因为它们是对象类型,而不是基元。第一个示例有效,因为Java在-128到127之间创建了Integers
的池(尽管可以配置此范围),并且它们之间的所有身份比较(使用==
)都可以,因为数字是从游泳池中取回。每次都会创建更大的数字,并且身份比较对他们不起作用 - 这就是为什么为了安全起见,必须使用equals()
进行对象之间的所有相等比较,这将始终有效。正如您刚才所见,使用==
有时会 ,但总是。
答案 1 :(得分:1)
由于num1
和num2
被声明为Integer
类型,而不是原始int
类型,因此分配使用自动装箱。解糖过程使用Integer.valueOf(int)
方法进行从int
到Integer
的转换。对于128或更大的值,不需要此方法来缓存Integer
个对象,因此每次自动装箱值128时都会创建一个新实例。
当测试这两个不同的对象的参考相等性时,结果为false
。对于-128到127之间的值,结果将为true,因为valueOf()
方法使用的缓存始终返回相同的实例。