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