概述
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)不等