自动拆箱指的是:将包装类型转为基本类型,比如将Integer对象转换成int值。
自动装箱指的是:将基本类型转换包装类型,比如将int值转换为Integer对象。
- 包装类型可用于泛型,而基本类型不可以,否则会出现编译错误,如下:
List<int> list1 = new ArrayList<>();//提示:type argument cannot be of primitive type,类型参数不能是基本数据类型
List<Integer> list = new ArrayList<>();
2. 基本类型比包装类型更高效。
3.两个包装类型的值可以相同,但不相等,看下面代码:
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
两个包装类型在使用 == 进行判断时候,判断的是指向的地址是否相同,由于是两个对象,所以地址是不同的。
而 i1.equals(i2) 的输出结果为true,是因为equals() 方法比较的是两个int值是否相等。
java1.5为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能,如下:
Integer i3 = 10;
int i4 = i3;
反编译后的代码:
Integer i3 =Integer.valueOf(10);
int i4 = i3.intValue();
也就是说,自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的;
自动装拆箱是一个很好的功能,大大节省了我们开发人员的精力,但也会引发一些麻烦,比如下面这段代码,性能就很差。
long t1 = System.currentTimeMillis();
Long sum = 0L;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);//运行时间6891ms
因为sum是Long类型,而i为int类型,在执行sum += i 的时候,会先把i强转为long类型,然后在把sum拆箱为long类型进行相加操作,之后在自动装箱为Long类型赋值给sum。
把sum换成long类型后,结果如下:
long t1 = System.currentTimeMillis();
long sum = 0L;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);//5ms