目录
一、包装类定义
Java是面向对象的语言,但是在Java中基本数据类型int,double等不是对象,不好进一步处理。因此,Java为每个基本类型都提供了包装类,如int类型数值的包装类Integer和boolean型数值的的包装类Boolean等,这样便可以吧这些基本数据类型转换为对象来处理了。
二、几种常见的包装类
原始类型 | 包装类 |
---|---|
byte | Byte |
boolean | Boolean |
char | Character |
double | Double |
float | Float |
int | Integer |
long | Long |
short | Short |
三、128陷阱
public static void main(String[] args) {
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2); //true
Integer num3 = 200;
Integer num4 = 200;
System.out.println(num3 == num4); //false
}
我们对文件反编译发现valueOf()方法
答案就在Integet的valueOf()方法当中,我们将数值在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在数组当中的地址,所以在-128-127之间的数值用==进行比较是相等的。
而不在这个区间的数,看equals()方法,需要新开辟一个内存空间,所以地址不相等。
四、自动拆装箱
自动装箱
基本数据类型变为包装类:调用包装类的构造器
Integer b=10; //Integer b=Integer.valueOf(10);
自动拆箱
包装类转换为基本数据类型
Integer b=10;
int a = b; //int a = b.intValue();
五、例题
public static void main(String[] args) {
int a = 10;
int b = 10;
Integer a1 = 10;
Integer b1 = 10;
Integer a2 = new Integer(10);
Integer b2 = new Integer(10);
System.out.println(a == b); // T 基本数据类型 == 比较值
System.out.println(a1 == b1); // T 128陷阱
System.out.println(a2 == b2); // F 引用数据类型 == 比较地址
System.out.println(a1 == a); // T 用 == 判断,自动拆箱
System.out.println(a1.equals(a)); // T 用 equals() 判断,自动装箱
System.out.println(a1 == a2); //F
System.out.println(a == a2); // T a2自动拆箱
}
答案解析:
1、true 比较值;
2、true a1 b1都在数组中的同一个位置
3、false 开辟了新的内存空间
4、true 因为包装类和基本数据类型用==比较的时候会自动拆箱
5、true 因为包装类和基本数据类型用equals方法比较的时候会自动拆箱(方法如下图)
6、false new开辟新空间
7、true 自动拆箱