如何!=和==运算符在Java中使用整数?

Deb*_*iti 11 java integer wrapper operator-keyword equals-operator

以下代码似乎让我感到困惑,因为它提供了两个不同的输出.代码在jdk 1.7上进行了测试.

public class NotEq {

public static void main(String[] args) {

    ver1();
    System.out.println();
    ver2();
}

public static void ver1() {
    Integer a = 128;
    Integer b = 128;

    if (a == b) {
        System.out.println("Equal Object");
    }

    if (a != b) {
        System.out.println("Different objects");
    }

    if (a.equals(b)) {
        System.out.println("Meaningfully equal.");
    }
}

public static void ver2() {
    Integer i1 = 127;
    Integer i2 = 127;
    if (i1 == i2) {
        System.out.println("Equal Object");
    }

    if (i1 != i2){
        System.out.println("Different objects");
    }
    if (i1.equals(i2)){
        System.out.println("Meaningfully equal");
    }
}

}
Run Code Online (Sandbox Code Playgroud)

输出:

[ver1输出]
不同的对象
有意义相等.

[ver2输出]
等对象
有意义相等

为什么==和!=测试为ver1()和ver2()产生不同的结果,相同的数字远小于Integer.MAX_VALUE?可以断定==检查大于127的数字(如代码中所示的整数包装类)是完全浪费时间吗?

ass*_*ias 10

对于-128到127之间的值缓存整数,因此Integer i = 127将始终返回相同的引用.Integer j = 128不一定会这样做.然后,您需要使用它equals来测试底层的相等性int.

这是Java语言规范的一部分:

如果被装箱值p为真,假,字节,或在范围\ u0000的一个char到\ u007f,或int或-128和127(含)之间的短号码,然后让r1和r2是的结果p的任何两个拳击转换.始终是r1 == r2的情况.

但是2次调用Integer j = 128可能返回相同的引用(不保证):

例如,较少内存限制的实现可以缓存所有char和short值,以及-32K到+ 32K范围内的int和long值.