基本數據類型封裝類比較
寫在前面的話
最近做項目時,遇到一個小bug,作為這么長時間的程序員,這么基礎的東西現在才搞懂,慚愧~ 在此mark下,希望以后不要再犯
問題:
Long long1=127L;
Long long2 = 127L;
System.out.println(long1==long2);//true
System.out.println(long1.equals(long2));//true
Long long1=128L;
Long long2 = 128L;
System.out.println(long1==long2);//false
System.out.println(long1.equals(long2));//true
同樣是封裝類型使用==比較,為啥<=127可以,>128就不可以呢?
問題分析:
1.兩者比較數值時使用封裝類的valueOf方法,而該方法緩存了-128~127的數值,超過這個數值的話,都會創(chuàng)建新的封裝對象,兩個對象用==相比的話,返回的肯定是false。以下為Long類型的valueOf源碼
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
2.哪幾種類型的valueOf方法都緩存了值呢? 以下五種都緩存了數值
| 類型 | 緩存范圍 | 數值范圍 |
| Character | 0~127 | 0~65535 |
| Byte | -128~127 | -128~127 |
| Short | -128~127 | -32768 ~ 32767 |
| Integer | -128~127 | -2147483648 ~ 2147483647 |
| Long | -128~127 | -9223372036854775808 ~ 9223372036854775807 |
3.Float和Double類型是否緩存值呢?以下是Float的valueOf源碼
public static Float valueOf(float f) {
return new Float(f);
}
可以看出沒有緩存數值,所以不能直接使用==來比較
4.一些其他關于基本類型和封裝類的特性,請參考以下博客地址
總結:
1.如果比較的兩個數值都是基本類型的封裝類,建議直接使用equals方法。

浙公網安備 33010602011771號