基本數據類型封裝類比較 Java源碼解讀(一) 8種基本類型對應的封裝類型

寫在前面的話

    最近作項目時,遇到一個小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

Java源碼解讀(一) 8種基本類型對應的封裝類型htm

 

總結:

1.若是比較的兩個數值都是基本類型的封裝類,建議直接使用equals方法。對象

相關文章
相關標籤/搜索