public static void main(String[] args) {
Integer t1 = 100, t2 =100, t3=150, t4=150;
int t5 = 150;
float f1 = 1.0f - 0.9f;
float f2 = 0.9f - 0.8f;
System.out.println(t1 == t2);
System.out.println(t3 == t4);
System.out.println(t4 == t5);
System.out.println(f1 == f2);
}
分析每行输出及其原因:
-
System.out.println(t1 == t2);
- 输出:
true
- 原因: 在 Java 中,
Integer
类的值在 -128 到 127 范围内会被缓存。这意味着如果你分配两个值在这个范围内的Integer
对象,实际上它们会引用同一个对象。因此,t1
和t2
都指向相同的缓存对象100
,所以t1 == t2
返回true
。
- 输出:
-
System.out.println(t3 == t4);
- 输出:
false
- 原因:
150
超出了Integer
缓存的范围,因此t3
和t4
分别指向不同的对象。由于它们是不同的对象实例,t3 == t4
返回false
。
- 输出:
-
System.out.println(t4 == t5);
- 输出:
true
- 原因:
t4
是Integer
对象,而t5
是基本类型int
。在比较时,t4
会自动拆箱为int
类型,即150
,然后与t5
进行比较。因为它们的值相同,所以t4 == t5
返回true
。
- 输出:
-
System.out.println(f1 == f2);
- 输出:
false
- 原因: 浮点数计算可能会导致精度损失。虽然数学上
1.0 - 0.9
和0.9 - 0.8
应该是相等的,但由于浮点数表示的精度问题,f1
和f2
的值在二进制表示上可能略有不同。因此,f1 == f2
返回false
。
- 输出:
总结
这段代码的输出顺序为:
true
false
true
false
每行的输出反映了 Java 在处理对象引用、自动拆箱和浮点数精度时的具体行为。