2014-12-31 36 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是一些小的數(精度)。