2012-05-15 94 views
3

我有以下代碼。錯誤的整數比較值輸出

public static void doIntCompareProcess() { 
    int a = 100; 
    int b = 100; 

    Integer c = 200; 
    Integer d = 200; 

    int f = 20000; 
    int e = 20000; 

    System.out.println(c == d); 
    compareInt(e, f); 
    compareInt(a, b); 
} 

public static void compareInt(Integer v1, Integer v2) { 
    System.out.println(v1 == v2); 
} 

這給了我這樣的輸出:

false 
false 
true 

凡當期的輸出應該是:

false 
false 
false 

爲什麼我收到的代碼錯誤輸出?

回答

11

最後一行對應於:

compareInt(100, 100); 

由於compareInt()有兩個Integer對象,這兩個參數得到自動裝箱。在此過程中,Integer(n)的值爲n的值較小。換句話說,compareInt()收到兩個引用相同的Integer(100)對象。這是導致最後一次比較評估爲true的原因。

參見Using == operator in Java to compare wrapper objects

底線是不使用==操作者直接比較Integer對象。有關進一步的討論,請參閱https://stackoverflow.com/a/1515811/367273

+0

但參數是'Integer'類 –

+0

@BhavikAmbani:請參閱更新的答案。 – NPE

+0

這是一個棘手的問題,令人驚訝的是我們經常忘記它。很好的答案! – Ewald

3

基於性能原因,原始字節範圍-128至127中的整數值被緩存。由於100是此範圍內的值,因此每次都會返回緩存中的相同對象。對於不在這個範圍內的值被認爲是不經常需要的,並且爲它們返回新的Integer對象。現在你的情況是,你正在比較對象引用而不是值,並且因爲100來自緩存,所以compareInt()中的參數指向相同的對象,因此比較等同於真。