建議27:謹慎包裝類型的大小比較
基本數據類型比較大小木有問題,不過其對應的包裝類型大小比較就需要注意了。看如下代碼:
1 public class Client { 2 public static void main(String[] args) { 3 Integer a = new Integer(100); 4 Integer b = new Integer(100); 5 /* compareTo返回值:若a>b則返回1;若a==b則返回0;若a<b則返回-1 */ 6 int result = a.compareTo(b); 7 8 System.out.println(a > b); 9 System.out.println(a == b); 10 System.out.println(a > b); 11 System.out.println(result); 12 } 13 }
運行結果:
false false false 0
為什么(a==b)返回值會是false呢?
通過對比字符串比較來理解,基本類型100通過包裝類Integer包裝后生產一個Integer對象的引用a,
而“==”使用來判斷兩個操作數是否有相等關系。如果是基本類型就直接判斷其值是否相等。
若是對象就判斷是否是同一個對象的引用,顯然我們new了兩個不同的對象。
但注意:
對於"<",">" 只是用來判斷兩個基本類型的數值的大小關系。在進行(a<b)運算時,
實際上是根據其intValue方法的返回對應的數值來進行比較的。因此返回肯定是false.
知道問題原因,解決起來就容易了。兩種方法:
第一種: a.intValue()==b.intValue();
第二種: a.compareTo(b);//返回-1代碼(a<b),返回0代表(a==b),返回1代表(a>b)
第二種方法源碼如下:
1 public int compareTo(Integer object) { 2 int thisValue = value; 3 int thatValue = object.value; 4 return thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1); 5 }
由此可知,底層實現還是一樣的。