奇数java整数比较

时间:2013-11-26 00:43:05

标签: java

如果这是重复的,我会高兴地将其删除,但我无法找到它。

为什么第二次比较会返回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

2 个答案:

答案 0 :(得分:4)

在Java中,Integers应使用equals()进行比较,因为它们是对象类型,而不是基元。第一个示例有效,因为Java在-128到127之间创建了Integers的池(尽管可以配置此范围),并且它们之间的所有身份比较(使用==)都可以,因为数字是从游泳池中取回。每次都会创建更大的数字,并且身份比较对他们不起作用 - 这就是为什么为了安全起见,必须使用equals()进行对象之间的所有相等比较,这将始终有效。正如您刚才所见,使用==有时会 ,但总是

答案 1 :(得分:1)

由于num1num2被声明为Integer类型,而不是原始int类型,因此分配使用自动装箱。解糖过程使用Integer.valueOf(int)方法进行从intInteger的转换。对于128或更大的值,不需要此方法来缓存Integer个对象,因此每次自动装箱值128时都会创建一个新实例。

当测试这两个不同的对象的参考相等性时,结果为false。对于-128到127之间的值,结果将为true,因为valueOf()方法使用的缓存始终返回相同的实例。