最近作項目時,遇到一個小bug,做爲這麼長時間的程序員,這麼基礎的東西如今才搞懂,慚愧~ 在此mark下,但願之後不要再犯html
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就不能夠呢?java
1.二者比較數值時使用封裝類的valueOf方法,而該方法緩存了-128~127的數值,超過這個數值的話,都會建立新的封裝對象,兩個對象用==相比的話,返回的確定是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源碼post
public static Float valueOf(float f) {
return new Float(f);
}
能夠看出沒有緩存數值,因此不能直接使用==來比較url
4.一些其餘關於基本類型和封裝類的特性,請參考如下博客地址spa
1.若是比較的兩個數值都是基本類型的封裝類,建議直接使用equals方法。對象