在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 对象时,会使用相同的对象。
两个Integer类型的对象用 == 比较内存地址,是调用Integer.valueOf ,里边有个IntegerCache缓存,缓存的是 -128~127的对象,如果超过这个返回,就都是new Integer,那肯定不一样,你这里的200,就是new了,地址不一样
在-128到127的范围内,Integer类型的变量把把值存储到常量池中,除该范围外点都是new一次就新开辟一个空间,==比较又是内容和地址,所以结果就为false啊