java自动拆装箱问题

在Java自动拆装箱中,我有以下疑问。希望能帮助解决

public class aaa {
    public static void main(String[] args) {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
        System.out.println(i1.equals(i2));
        System.out.println(i3.equals(i4));
    }
}

结果是

true
false
true
true

为什么第二个为false呢?

当你使用自动装箱功能时,Java 会使用常量池来缓存 Integer 对象。这意味着,当你使用整数值在 -128 到 127 之间的 Integer 对象时,会使用相同的对象。

  • 所以,在你的代码中,当你将值 100 赋给 i1 和 i2 时,它们会指向同一个对象。因此,i1 == i2 返回 true。
  • 然而,当你将值 200 赋给 i3 和 i4 时,它们将指向不同的对象,因此 i3 == i4 返回 false。

Integer缓存池问题

两个Integer类型的对象用 == 比较内存地址,是调用Integer.valueOf ,里边有个IntegerCache缓存,缓存的是 -128~127的对象,如果超过这个返回,就都是new Integer,那肯定不一样,你这里的200,就是new了,地址不一样

在-128到127的范围内,Integer类型的变量把把值存储到常量池中,除该范围外点都是new一次就新开辟一个空间,==比较又是内容和地址,所以结果就为false啊