2014-12-31 34 views
-1

我想出了一个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; 
    } 
} 

这三种说法是正确的?

  1. f1 == f2
  2. f1 == f3
  3. f2 == f1[1]
  4. x == f1[0]
  5. f == f1[0]

我需要选择只有3语句。

那么,1显然是错误的,因为我们正在比较两个不同的引用,2显然是真的,因为引用是相同的。但我不知道原始人。我感到困惑的是,如果我们比较Integer s在-128到127的范围内,他们就是缓存。相关topic。有什么关于原始的,一些狭隘的情况?

我一直在寻找它是如何工作的JLS 8,但没有发现任何有用的东西。

+0

这是当它autobox,没有自动装箱这里,它只是普通的原始值作仪, –

+0

确实如此。你也可以运行一个输出上述真/假值的程序。 – Joeblade

+4

第三个表达式甚至没有编译。 –

回答

4

比较例3不能编译:它试图阵列比较为标量。

比较图4和5涉及的原语和由值完成。没有参考文献或涉及自动装箱。因此,以下是不相关的:

我很困惑的是,如果我们比较Integers范围-128至127他们缓存。

由于42可以准确地作为float来表示,比较例4将返回true

比较5还将返回true,因为它比较两个相同的float值。

1

2,4和5是true

虽然记得由==比较浮动可能会非常棘手,它的安全做到这一点是这样的:

Math.abs(float1 - float2) < epsilon

其中epsilon是一些小的数(精度)。