2014-09-03 85 views
1

我是JAVA的新手,正在通過相等運算符。在嘗試了幾種操作數組合之後,我對Java中相等運算符(==)的兼容操作數的定義究竟是什麼有些困惑。關於JAVA中的相等運算符(兼容操作數)的查詢

int x = 23; 
if (x == 23.3f) { // compiler accepts it. (may be because both are primitives) 

int x = 23;  
Double d = new Double(23.3); 
if (x == d) { // compiler accepts it. (may be compatible pair of primitive and object reference) 

int x = 23; 
String s = "hello"; 
if (x == s) // compiler throws error - incompatible operands for == operator. 

因此,它看起來對於我來說,對於相等運算符應該有一些兼容操作數的正式定義。請幫我澄清這個疑問。

+0

字符串有'.equals'方法。並在你的最後一個'如果'它顯然,他們是不兼容的,因爲你是比較一個對象(字符串)與原始類型(int,long,double ...) – 2014-09-03 08:30:44

+0

我明白.equals在那裏,但我的查詢是專門針對==的。如果你看到我的第二個例子,我將Object與Object(Double。)進行比較,然後編譯器接受它。 – pankaj 2014-09-03 08:39:00

回答

0
  1. 編譯器接受它,因爲x23.3f有原始的數字類型。並且比較將返回false

  2. 編譯器接受它,因爲java unboxesDouble反對double比較基元。

  3. 編譯器無法接受它,因爲x是原始數值類型,並且s是對String類實例的引用。不可能比較數字基元和參考對象。

+0

關於#2,當您的其他操作數是原始的時候,拆箱總是會發生? – pankaj 2014-09-03 08:41:41

+0

根據官方定義:'自動裝箱(和拆箱)是Java編譯器在原語類型和它們相應的對象包裝類之間進行的自動轉換.'原始類型和相應的對象包裝類例子:'int'和'Integer' ,'double'和'Double'等。比較一下,如果一個操作數是一個包裝類實例,而另一個操作數是一個原始類型,那麼拆箱就會發生。而且,如果兩個操作數都是包裝類實例,即Integer,那麼java會比較這些對象的值,而不是引用。 – 2014-09-03 08:52:31

+2

比較'Double'和/或'double'值不要使用'=='運算符。使用'java.lang.Double.compare()'方法。這是因爲精度問題。檢查此鏈接,例如:http://www.tutorialspoint.com/java/lang/double_compare.htm – 2014-09-03 08:53:20

1

對於

int x = 23; 
if (x == 23.3f) 

如果你看一下使用javap -v字節碼,該int將被轉換爲一個float。即i2f將被調用,然後將它們作爲2浮點值使用fcmpl進行比較。

public static void main(java.lang.String[]); 
    Code: 
    Stack=2, Locals=2, Args_size=1 
    0: bipush 23 
    2: istore_1 
    3: iload_1 
    4: i2f  // The line of interest. Converts int to float. 
    5: ldc  #16; //float 23.3f 
    7: fcmpl  // compare two floats 
    8: ifne 11 
    11: return 

在第三種情況下,您正在比較原始數據與Object(String),這是不可能的。

0

字符串是對象。 ==通過引用比較對象,而不是內部值。 所有其他(int, double)==一起比較有對象的引用,以便在字符串的情況下,它不匹配這樣的字符串,我們必須ü.equals運營商還Java是區分大小寫,因此在比較字符串ü必須照顧Case's of strings