public class Main {
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        Integer c = 127;
        Integer d = 127;
        System.out.println(a == b);
        System.out.println(c == d);
    }
}

输出为

false
true

???

这里需要注意的是 Java 即使会自动的装箱,Integer 在使用 == 比较的时候同样是比较的对象,也就是内存地址。

那么为什么 127 的比较结果为 true ? 原因在于 Java 的装箱时会使用 valueOf 这个函数,它有一个缓存,范围是 -128~127,如果在这个范围内(这个范围可以通过 jvm 参数调节),将返回缓存的对象(在启动时初始化缓存范围内的对象)。

Java 其他包装类也有类似的问题。

解决方法:建议除非明确比较对象,都使用 Objects.equals 方法(由于有自动装箱的存在,其同样能对基础数据类型使用)。