讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議27:謹慎包裝類型的大小比較 >

建議27:謹慎包裝類型的大小比較

基本類型是可以比較大小的,其所對應的包裝類型都實現了Comparable接口也說明了此問題,那我們來比較一下兩個包裝類型的大小,代碼如下:


public class Client{

public static void main(Stringargs){

Integer i=new Integer(100);

Integer j=new Integer(100);

compare(i, j);

}

//比較兩個包裝對像大小

public static void compare(Integer i, Integer j){

System.out.println(i==j);

System.out.println(i>j);

System.out.println(i<j);

}

}


代碼很簡單,產生了兩個Integer對象,然後比較兩者的大小關係,既然基本類型和包裝類型是可以自由轉換的,那上面的代碼是不是就可打印出兩個相等的值呢?讓事實說話,運行結果如下:


false

false

false


竟然是3個false,也就是說兩個值之間不等,也沒大小關係,這也太奇怪了吧。不奇怪,我們來一一解釋。


i==j


在Java中「==」是用來判斷兩個操作數是否有相等關係的,如果是基本類型則判斷值是否相等,如果是對像則判斷是否是一個對象的兩個引用,也就是地址是否相等,這裡很明顯是兩個對象,兩個地址,不可能相等。


i>j和i<j


在Java中,「>」和「<」用來判斷兩個數字類型的大小關係,注意只能是數字型的判斷,對於Integer包裝類型,是根據其intValue()方法的返回值(也就是其相應的基本類型)進行比較的(其他包裝類型是根據相應的value值來比較的,如doubleValue、floatValue等),那很顯然,兩者不可能有大小關係的。

問題清楚了,修改總是比較容易的,直接使用Integer實例的compareTo方法即可。但是這類問題的產生更應該說是習慣問題,只要是兩個對像之間的比較就應該採用相應的方法,而不是通過Java的默認機制來處理,除非你確定對此非常瞭解。