基本类型 | 封装类型 | 字节长度 | 默认值 |
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);
}
- 泛型只能使用封装类型, 而不能使用基本数据类型