Java包裝類型的大小比較需謹慎
基本類型是可以比較大小的,其所對應的包裝類型都實現了Comparable 接口也說明了此問題,那我們來比較一下兩個包裝類型的大小,代碼如下:
public class Client {
public static void main(String[] args) {
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,也就是說兩個值之間不等,也沒大小關系,這也太奇怪了吧。不奇怪,我們來一一解釋。
問題清楚了,修改總是比較容易的,直接使用Integer 實例的compareTo 方法即可。但是這類問題的產生更應該說是習慣問題,只要是兩個對象之間的比較就應該采用相應的方法,而不是通過Java 的默認機制來處理,除非你確定對此非常了解。
public class Client {
public static void main(String[] args) {
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 的默認機制來處理,除非你確定對此非常了解。