我在Java测试中提出了以下问题:
import java.awt.Button;
class CompareReference
{
public static void main(String [] args)
{
float f = 42.0f;
float [] f1 = new float[2];
float [] f2 = new float[2];
float [] f3 = f1;
long x = 42;
f1[0] = 42.0f;
}
}
这三个陈述是真的吗?
f1 == f2
f1 == f3
f2 == f1[1]
x == f1[0]
f == f1[0]
我只需要选择3个陈述。
嗯,1
显然是假的,因为我们正在比较两个不同的引用,2
显然是正确的,因为引用是相同的。但我不了解原始人。我感到困惑的是,如果我们将范围-128到127之间的Integer
进行比较,那么它们就是缓存。相关topic。有什么关于原始的,一些狭隘的案例?
我一直在寻找它在JLS 8
中是如何运作的,但没有找到任何有用的东西。
答案 0 :(得分:4)
比较3将无法编译:它尝试将数组与标量进行比较。
比较4和5涉及原语并按值完成。没有涉及参考或自动装箱。因此,以下内容与此无关:
我感到困惑的是,如果我们将范围-128到127之间的
Integers
进行比较,那么它们就是缓存。
由于42
可以完全表示为float
,因此比较4将返回true
。
比较5也将返回true
,因为它正在比较两个相同的float
值。
答案 1 :(得分:1)
2,4和5是true
。
虽然记住按==
比较浮点数可能会比较棘手,但这样做更安全:
Math.abs(float1 - float2) < epsilon
其中epsilon
是一个小数字(精度)。