基本型別
Java有八種基本型別
- int
- float
- double
- long
- boolean
- char
- short
- byte
基本型別如果是區域性變數,那它們的位置會在虛擬機器棧種。如果是成員變數它們會存放在堆中。
包裝型別
相對應的Java也有八種包裝型別
- Int
- Float
- Double
- Long
- Boolean
- Char
- Short
- Byte
區別
1.預設值:基本型別都各自有自己的預設值,包裝型別的預設值是null
。
2.使用:除了定義一些常量和區域性變數之外,在方法引數、物件屬性中很少會使用基本型別來定義變數。
而且包裝型別可用於泛型,而基本型別不可以。(比如int的預設值是0,Integer的預設值是null,null對於程式來說比較好處理,可以進行空值判斷,而且資料庫中欄位值可能為null,這個時候int會報錯,而Integer不會)
3.比較方式:基本型別直接都用==
比較,而包裝型別用equals()
來比較。
4.儲存位置:幾乎所有物件都存放在堆上,不說全部是因為HotSpot 虛擬機器引入了 JIT 最佳化之後,會對物件進行逃逸分析,如果發現某一個物件並沒有逃逸到方法外部,那麼就可能透過標量替換來實現棧上分配,而避免堆上分配記憶體。
自動拆裝箱
Integer a = 1; //此時發生了裝箱,呼叫了Integer.valueOf(1)方法,每個包裝型別都有其valueOf()方法。
int b = a; //此時發生了拆箱,呼叫了a.intValue()方法,每個包裝型別都有其拆箱方法。
快取機制
Java 基本資料型別的包裝型別的大部分都用到了快取機制來提升效能。Byte,Short,Integer,Long 這 4 種包裝類預設建立了數值 [-128,127] 的相應型別的快取資料,Character 建立了數值在 [0,127] 範圍的快取資料,Boolean 直接返回 True or False。
Integer a=40; //裝箱,Integer.valueOf(40),實際使用了Integer快取。
Integer b = new Integer(40);//實際建立了一個新的物件