基礎(chǔ)類型與包裝類型

數(shù)據(jù)類型 字節(jié)數(shù) 二進(jìn)制位數(shù) 范圍 緩存值
byte 1 8 -128~127 -128~127
short 2 16 -32768~32767 -128~127
int 4 32 -2147483648~2147483647 -128~127
long 8 64 -9223372036854775808 ~ 9223372036854775807 -128~127
float 4 32 1.4E-45~3.4028235E38
double 8 64 4.9E-324~1.7976931348623157E308
char 2 16 0~65535 0~127
boolean 1 8 true/false true/false

使用注意

long型后如果不加L則默認(rèn)為int型,浮點(diǎn)型如果不加F則默認(rèn)為double型。

自動拆裝箱與緩存機(jī)制

Integer a = 0;
Integer a = Integer.valueOf(0); //手動裝箱
int b = a;
int b = a.intValue();//手動拆箱

Boolean的緩存是true,false,Byte、Short、Integer、Long的緩存都是-128到127。Character是緩存是0~127對應(yīng)的字符。

在執(zhí)行Integer a = new Integer(0)時,JVM會先創(chuàng)建一個對象,值為0,再把這個對象的引用賦值給a。基于節(jié)約內(nèi)存和效率等的考慮,Java對包裝類的values方法做了一些優(yōu)化。如Integer,在執(zhí)行Integer a = Integer.values(0)時,Java會在緩存中直接找到之前創(chuàng)建好的緩存,直接把0相應(yīng)的引用給a。

Integer a1 = 0;//Integer a = Integer.value(0)
Integer b1 = 0;
Integer c1 = new Integer(0);
Integer a2 = 128;
Integer b2 = 128;
Integer c2 = new Integer(128);
System.out.println(a1 == b1); //true(緩存范圍是-128~127)
System.out.println(a1 == c1); //false
System.out.println(a2 == b2); //false
System.out.println(a2 == c2); //false

這里Integer和int類型進(jìn)行"=="比較,會把Integer類型自動拆箱進(jìn)行比較。

long a = 1L;
int b = 1;
short c = 1;
System.out.println(a == b); //true
System.out.println(a == c); //true

使用原則

最后我們來整理一下基本類和包裝類在實(shí)際使用時,應(yīng)該遵循哪些原則?
1.盡量使用values方法。最大可能使用緩存,提高程序的效率。
2.類變量使用包裝類。想象有一個和數(shù)據(jù)庫表對應(yīng)的實(shí)體類,如果你使用的基本數(shù)據(jù)類型,在插入時,可能會插入一些讓你意想不到的初始值。
3.方法的參數(shù)要使用包裝類。使用包裝類意味著你在調(diào)用時,可以令若干個參數(shù)為null。null是無意義的。但是如果你使用了基本數(shù)據(jù)類型,那么,你將不得不傳入一個值,即使這個值對你來說,沒有什么意義。
4.方法的返回值要根據(jù)是否可為null來確定使用包裝類還是基本類。當(dāng)一個方法的返回值,一定不會出現(xiàn)null的情況時,推薦使用基本類來作為返回值。這樣,調(diào)用者在拿到這個方法的返回值時,就不必?fù)?dān)心它是為null了。
5.方法內(nèi)部(局部變量)使用基本類型。基本類型的時間效率和效率上來說,都是要優(yōu)于包裝類的。所以,在方法內(nèi)部,能使用基本類型盡量不要使用包裝類。
6.小數(shù)的計(jì)算。嚴(yán)格來說,這條不屬于基本類型和包裝類的內(nèi)容,但是,這里順便提交,當(dāng)涉及到小數(shù)的計(jì)算時,要考慮到計(jì)算的精度問題,可以使用BigDecimal,也可以通過縮小計(jì)量單位,達(dá)到化零為整的目的,這個,根據(jù)具體場景來確定。

彩蛋

如果定義int類型的i為int的最大值,那么i + 1會怎么樣呢?

int i = Integer.MAX_VALUE;
System.out.println(i);
System.out.println(i + 1);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容