Java 整数比较值的输出错误

Java 整数比较值的输出错误,java,comparison,integer,int,Java,Comparison,Integer,Int,我有以下代码 public static void doIntCompareProcess() { int a = 100; int b = 100; Integer c = 200; Integer d = 200; int f = 20000; int e = 20000; System.out.println(c == d); compareInt(e, f); compareInt(a, b); } publ

我有以下代码

public static void doIntCompareProcess() {
    int a = 100;
    int b = 100;

    Integer c = 200;
    Integer d = 200;

    int f = 20000;
    int e = 20000;

    System.out.println(c == d);
    compareInt(e, f);
    compareInt(a, b);
}

public static void compareInt(Integer v1, Integer v2) {
    System.out.println(v1 == v2);
}
这给了我这个输出:

false
false
true
其中电流输出应为:

false
false
false

为什么代码的输出错误?

最后一行对应于:

compareInt(100, 100);
由于
compareInt()
接受两个
Integer
对象,因此这两个参数会自动装箱。在这个过程中,对于
n
的小值,将插入
Integer(n)
的实例。换句话说,
compareInt()
接收对同一
Integer(100)
对象的两个引用。这就是导致最后一次比较的结果是
true


底线是不要使用
=
操作符直接比较
整数
对象。如需进一步讨论,请参阅原语字节范围内的整数值-128到127会因性能原因而被缓存。因为100是这个范围内的值,所以每次都会从缓存返回相同的对象。对于不在此范围内的值,我们认为不经常需要这些值,并为它们返回新的整数对象。现在,在您的例子中,您正在比较对象引用而不是值,因为100来自缓存,compareInt()中的参数指向同一个对象,因此比较等于true。

但是参数是
Integer
类这是一个棘手的问题,令人惊讶的是,我们经常忘记它。回答得好!