標籤:格式 實現 中斷 ram 位元組 box har 斷點調試 src
概述
java八大基礎資料型別 (Elementary Data Type)byte,short,int,long,float,double,char,boolean,他們分別對應有各自的封裝。java為啥要保留基礎資料型別 (Elementary Data Type)?因為基礎資料型別 (Elementary Data Type)常用且存於棧中,佔用空間少,效能比使用對象好,且基礎資料型別 (Elementary Data Type)有預設值,而對象的預設值為null。為啥還要有class對象和基礎資料型別 (Elementary Data Type)對應呢?因為java是物件導向語言,基礎資料型別 (Elementary Data Type)的存在是因為效能的優勢,與之對應的封裝類就是為了符合物件導向開發,特別是在實現了自動裝箱拆箱操作以後。
擷取基礎資料型別 (Elementary Data Type)
通過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的解析,對基礎資料型別 (Elementary Data Type)賦值
行標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使用的同一個緩衝自然相等。
那麼有哪些封裝類型具有緩衝呢
Character範圍0-127是緩衝常用的ASCII字元,範圍-128到127表示一個位元組,因此緩衝幾乎也是這個範圍。詳情請看電腦儲存資料的格式
不管是否有緩衝,使用new關鍵字建立的都不會使用緩衝中的資料,如Integer a=1和Integer b=new Integer(1)不等
歡迎加入學習交流群569772982,大家一起學習交流。
java基礎資料型別 (Elementary Data Type)