概述
java八大基本數(shù)據(jù)類型byte,short,int,long,float,double,char,boolean,他們分別對(duì)應(yīng)有各自的封裝。java為啥要保留基本數(shù)據(jù)類型?因?yàn)榛緮?shù)據(jù)類型常用且存于棧中,占用空間少,性能比使用對(duì)象好,且基本數(shù)據(jù)類型有默認(rèn)值,而對(duì)象的默認(rèn)值為null。為啥還要有class對(duì)象和基本數(shù)據(jù)類型對(duì)應(yīng)呢?因?yàn)閖ava是面向?qū)ο笳Z(yǔ)言,基本數(shù)據(jù)類型的存在是因?yàn)樾阅艿膬?yōu)勢(shì),與之對(duì)應(yīng)的包裝類就是為了符合面向?qū)ο箝_發(fā),特別是在實(shí)現(xiàn)了自動(dòng)裝箱拆箱操作以后。
獲取基本數(shù)據(jù)類型
通過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;
}
執(zhí)行 javap -c className.class 得出如下圖

行標(biāo)0-1是對(duì)int a=1的解析,對(duì)基本數(shù)據(jù)類型賦值
行標(biāo)2-3是對(duì)Integer b=2的解析,注意后面有一個(gè)Integer.valueOf(),意味這這句正確執(zhí)行的是Integer b=Integer.valueOf(2),需要驗(yàn)證的可以在valueOf方法中斷點(diǎn)調(diào)試
行標(biāo)6-8是執(zhí)行a=b這里實(shí)際執(zhí)行的代碼是a=b.intValue()
java的自動(dòng)裝箱拆箱是由編譯器就處理好的
基本類型對(duì)應(yīng)封裝類的緩存
在某些封裝類中,定義了內(nèi)部類作為緩存即實(shí)例化時(shí)不會(huì)去new,直接取緩存中的數(shù)據(jù),我們可以看看這樣一段代碼
Integer a=1;
Integer b=1;
a=b?
答案是a=b,即使a,b都是對(duì)象,前面我們已經(jīng)說過Integer a=1實(shí)際上是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);
}
也就是說如果我們的值在緩存最小值和最大值之間,那么就直接使用緩存中的值,不會(huì)去new,a,b使用的同一個(gè)緩存自然相等。
那么有哪些封裝類型具有緩存呢
Byte緩存范圍為-128到127,
Short緩存范圍-128到127
Integer默認(rèn)緩存范圍-128到127,可設(shè)置最大值,如:在VM中加入-Djava.lang.Integer.IntegerCache.high=1000,最大值就為1000
Long緩存范圍-128到127
Character緩存范圍0-127
Character范圍0-127是緩存常用的ASCII字符。范圍-128到127表示一個(gè)字節(jié),因此緩存幾乎也是這個(gè)范圍。詳情請(qǐng)看計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的格式
不管是否有緩存,使用new關(guān)鍵字創(chuàng)建的都不會(huì)使用緩存中的數(shù)據(jù),如Integer a=1和Integer b=new Integer(1)不等