2017-09-01 209 views
3

我想了解下面的代碼的行爲,當數值比較運算被用來在Java中比較2個Integer對象物體的比較。Java的自動裝箱,並使用運營商

Integer i1 = new Integer(1); 
    Integer i2 = new Integer(1); 
    System.out.println(i1 == i2); 
    System.out.println(i1 > i2); 
    System.out.println(i1 >= i2); 

上面的代碼的輸出是:

false 
false 
true 

我明白了什麼是發生在第一種情況下(對象實例的比較時這就是爲什麼它給假)。但爲什麼第二種和第三種情況是不同的,它是如何工作的?

+0

我對你的結果感到困惑。我認爲JLS需要緩存和相同的對象,範圍在-128到127之間的「Integers」。 https://stackoverflow.com/questions/20897020/why-integer-class-caching-values-in-the-range-128-to-127 – markspace

+0

@markspace自動裝箱或調用'的valueOf只有當()'。使用'new'關鍵字創建的對象必須始終不同。 – shmosel

+0

@shmosel啊,對!我鏈接到的SO問題說「盒裝」對象。謝謝你指出。 – markspace

回答

4

因爲<,>,>=<=是數字比較,因此編譯器知道它必須拆箱。

然而,==!=總是工作作爲參考比較器對於非原始類型。

+0

二元數值提升(轉換爲數字)形成在<, <=, >進行,如([JLS 15.20.1(https://docs.oracle.com/javase/specs/jls/se8/html/指定> =操作數jls-15.html#jls-15.20.1)) 第二和第三個場景。但是,在!=和==的情況下,至少有一個操作數必須是數字類型才能進行升級。 – ayushi