自动装箱是java 1.5 引入的新技术,主要是为了解决 原始类型和对象的转换,
也就是 原始类型
byte short int long float double boolean char 与 包装对象
Byte Short Integer Long Float Double Boolean Character
的转换。
- 什么是自动装箱?
Integer var1=6;//自动装箱
Integer var2=6;//自动装箱
if(var1==var2){
System.out.println("true");
}else{
System.out.println("false");
}
结果输出:true
int var1=6;
int var2=6;
if(var1==var2){
sysytem.out.println("true");
}else{
system.out.println("false");
}
结果输出: true
自动装箱的处理代码:
Integer var1=Integer.valueOf(6);//实际运行代码
Integer var2=Integer.valueOf(6);//实际运行代码
if(var1==var2){
System.out.println("true");
}else{
System.out.println("false");
}
输出结果是: true
到目前为止,已经知道了自动装箱是用来把原始数据类型转换成对象。
2 . 自动装箱的用途:
赋值和方法调用传递参数。
自动装箱最常使用的场景是集合,由于集合不能接收原始类型的数据,只接受包装对象。
List<Integer> integerList=new ArrayList<>();
integerList.add(1); //autoBox
integerList.add(2);
Iterator<Integer> it=integerList.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
输出结果:
1
2
3 第一个示例遗留的问题,为什么结果是true
根据我们目前了了解的
Integer var1=6;//自动装箱
Integer var2=6;//自动装箱
以上代码创建了对象。 == 在此的意义是判断引用是否相等。
Integer var1=Integer.valueOf(6);
Integer var2=Integer.valueOf(6);
valueof 源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
可以看出两个对象的引用是想等的,因为他们值相同。
目前我们已经明白了自动装箱的就是用来把原始数据类型变成包装对象。动作的执行者是编译器。
4.缺点
自动装箱可以使我们的代码变得简洁,但是没有缺点吗?辩证法来说事物具有两面性。
Integer count=0;
for(int i=0;i<1000;i++){
count+=i; // 每次循环到这里,都会创建新的对象。
}
如果出现上面的情况,每次循环到执行 count+=i; 会创建一个对象,这样就会浪费内存,会降低程序性能加重(GC)垃圾回收的工作量。
这种问题是自动装箱本身引入的问题,因为自动装箱就是把原始类型提升为对象。 我们要在编写代码的时候,尽量避免上面情况的出现。