java基本數據類型

概述

java八大基本數據類型byte,short,int,long,float,double,char,boolean,他們分別對應有各自的封裝。java為啥要保留基本數據類型?因為基本數據類型常用且存于棧中,占用空間少,性能比使用對象好,且基本數據類型有默認值,而對象的默認值為null。為啥還要有class對象和基本數據類型對應呢?因為java是面向對象語言,基本數據類型的存在是因為性能的優勢,與之對應的包裝類就是為了符合面向對象開發,特別是在實現了自動裝箱拆箱操作以后。

獲取基本數據類型

  • 通過Class.getPrimitiveClass("byte")獲取byte.class類型

  • Byte.class==byte.class返回false

  • Class.getPrimitiveClass("byte")==byte.class返回true

裝箱拆箱

代碼如下

public void packingAndUnboxing(){
        int a=1;
        Integer b=2;
        a=b;
    }

執行 javap -c className.class 得出如下圖

解析字節碼
  • 行標0-1是對int a=1的解析,對基本數據類型賦值

  • 行標2-3是對Integer b=2的解析,注意后面有一個Integer.valueOf(),意味這這句正確執行的是Integer b=Integer.valueOf(2),需要驗證的可以在valueOf方法中斷點調試

  • 行標6-8是執行a=b這里實際執行的代碼是a=b.intValue()

java的自動裝箱拆箱是由編譯器就處理好的

基本類型對應封裝類的緩存

在某些封裝類中,定義了內部類作為緩存即實例化時不會去new,直接取緩存中的數據,我們可以看看這樣一段代碼

Integer a=1;
Integer b=1;
a=b?

答案是a=b,即使a,b都是對象,前面我們已經說過Integer a=1實際上是Integer a=Integer.valueOf(1),方法源碼如下

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

也就是說如果我們的值在緩存最小值和最大值之間,那么就直接使用緩存中的值,不會去new,a,b使用的同一個緩存自然相等。

那么有哪些封裝類型具有緩存呢

  • Byte緩存范圍為-128到127,

  • Short緩存范圍-128到127

  • Integer默認緩存范圍-128到127,可設置最大值,如:在VM中加入-Djava.lang.Integer.IntegerCache.high=1000,最大值就為1000

  • Long緩存范圍-128到127

  • Character緩存范圍0-127

Character范圍0-127是緩存常用的ASCII字符。范圍-128到127表示一個字節,因此緩存幾乎也是這個范圍。詳情請看計算機存儲數據的格式

不管是否有緩存,使用new關鍵字創建的都不會使用緩存中的數據,如Integer a=1和Integer b=new Integer(1)不等

基本類型經典面試題(推薦)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容