基本類型 | 封裝類型 | 字節長度 | 默認值 |
boolean | Boolean | 1 | false |
byte | Byte | 1 | 0 |
char | Character | 2 | 'u0000' |
short | Short | 2 | 0 |
int | Integer | 4 | 0 |
float | Float | 4 | 0.0F |
long | Long | 8 | 0L |
double | Double | 8 | 0.0 |
注意點:
- 因爲JVM屏蔽了硬件之間的差異性, 所以Java中的數值都是有符號的, 他們的取值範圍都是固定的
- 封裝之後的類型, 默認值爲null
- 基本類型和封裝類型的比較:
public static void main(String[] args) {
int num1 = 999;
Integer num2 = new Integer("999");
Integer num3 = new Integer("999");
System.out.println("num1 == num2: " + (num1 == num2));
System.out.println("num2.equals(num1): " + num2.equals(num1));
System.out.println("num3 == num2 : " + (num3 == num2));
System.out.println("num3.equals(num2): " + num3.equals(num2));
}
運行結果:
num1 == num2: true
num2.equals(num1): true
num3 == num2 : false
num3.equals(num2): true
運行結果分析:
- 基本類型和封裝類型進行"=="比較的時候, 封裝類型會自動拆箱, 然後變成基本類型就行比較
- 兩個封裝類型進行 "=="比較的時候, 判斷的是兩個對象是否是同一個對象, 所以要用equals就行比較
- 封裝類型調用equals方法, 但是參數是基本類型的時候, 會先將基本類型裝箱爲封裝類型
- Boolean, Byte, Character, Short, Integer, Long使用了Java的常量池, 也就是說當數據範圍在 -128~127的時候, 會使用緩存,Float和Double沒有使用常量池
public static void main(String[] args) {
int num1 = 120;
Integer num2 = new Integer("120");
System.out.println("num1 == num2: " + (num1 == num2));
System.out.println("num2.equals(num1): " + num2.equals(num1));
}
運行結果:
num1 == num2: true
num2.equals(num1): true
緩存源碼:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
- 泛型只能使用封裝類型, 而不能使用基本數據類型