| 數(shù)據(jù)類型 | 字節(jié)數(shù) | 二進制位數(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則默認為int型,浮點型如果不加F則默認為double型。
自動拆裝箱與緩存機制
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對應的字符。
在執(zhí)行Integer a = new Integer(0)時,JVM會先創(chuàng)建一個對象,值為0,再把這個對象的引用賦值給a。基于節(jié)約內存和效率等的考慮,Java對包裝類的values方法做了一些優(yōu)化。如Integer,在執(zhí)行Integer a = Integer.values(0)時,Java會在緩存中直接找到之前創(chuàng)建好的緩存,直接把0相應的引用給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類型進行"=="比較,會把Integer類型自動拆箱進行比較。
long a = 1L;
int b = 1;
short c = 1;
System.out.println(a == b); //true
System.out.println(a == c); //true
使用原則
最后我們來整理一下基本類和包裝類在實際使用時,應該遵循哪些原則?
1.盡量使用values方法。最大可能使用緩存,提高程序的效率。
2.類變量使用包裝類。想象有一個和數(shù)據(jù)庫表對應的實體類,如果你使用的基本數(shù)據(jù)類型,在插入時,可能會插入一些讓你意想不到的初始值。
3.方法的參數(shù)要使用包裝類。使用包裝類意味著你在調用時,可以令若干個參數(shù)為null。null是無意義的。但是如果你使用了基本數(shù)據(jù)類型,那么,你將不得不傳入一個值,即使這個值對你來說,沒有什么意義。
4.方法的返回值要根據(jù)是否可為null來確定使用包裝類還是基本類。當一個方法的返回值,一定不會出現(xiàn)null的情況時,推薦使用基本類來作為返回值。這樣,調用者在拿到這個方法的返回值時,就不必擔心它是為null了。
5.方法內部(局部變量)使用基本類型?;绢愋偷臅r間效率和效率上來說,都是要優(yōu)于包裝類的。所以,在方法內部,能使用基本類型盡量不要使用包裝類。
6.小數(shù)的計算。嚴格來說,這條不屬于基本類型和包裝類的內容,但是,這里順便提交,當涉及到小數(shù)的計算時,要考慮到計算的精度問題,可以使用BigDecimal,也可以通過縮小計量單位,達到化零為整的目的,這個,根據(jù)具體場景來確定。
彩蛋
如果定義int類型的i為int的最大值,那么i + 1會怎么樣呢?
int i = Integer.MAX_VALUE;
System.out.println(i);
System.out.println(i + 1);