java程序,运行结果与想象的不一样

2025-03-11 03:11:01
推荐回答(4个)
回答1:

实例化Integer涉及到整型数的自动拆装箱,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例
Integer.valueof()的源代码:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
简单地解释这段代码,就是如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low 默认是-128;IntegerCache.high默认是127.
所以当你的Integer值>-128 <127时 实例化的两个值是处于同一缓存位置,但超过这个范围,实例化的两个值就是两个不同的位置
而 == 的比较 只有等号两边的值为同一值.也就是在内存中是同一个 才会返回true 所以你要想比较两个值大小是否相等的话,需要使用.equals

回答2:

==是用来比较两个基本数据类型的变量值是否相等,==也用于判断两个对象引用名称是否参考至同一个对象。在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用(就是说内存指向相同)。
所以造成 System.out.println(i1==i2); 输出true

如果超过了从–128到127之间的值,被装箱后的Integer对象并

不会被重用(指向了新的内存地址),即相当于每次装箱时都新建一个Integer对象
所以System.out.println(i3==i4); 输出false

总结:–128到127之间的值内存空间引用的是同一个地址,超出则存在新的内存空间

回答3:

你用的是对象类型的变量,而不是简单变量,如果你把程序中的Integer全部换成int,输出结果都会是true。

对象类型变量判断是否相等不是用==,而是用.equals

回答4:

==运算符作用于对象只是比较对象是否是同一个,而不是内容,对象比较内容应该使用equals方法