自动装箱与拆箱功能是指将基本数据类型变量封装在Wrapper类对象中或将Wrapper类对象中的值赋给基本数据类型变量的行为。
装箱(Boxing)
int i = 10;
Integer integer = i;
拆箱(Unboxing)
Integer fooInteger = 10;
int fooPrimitive = fooInteger;
自动装箱与拆箱功能是所谓的编译程序蜜糖(compilerSugar),在使用的过程中容易产生一些不易察觉的错误。
Integer i = null;
int j = i;
事实上编译器将上述代码转换为:
Integer i = null;
int j = i.intValue();
在调用 intValue() 时将会出现空指针错误。此外,对于Wrapper对象不应该使用‘==’来判断相等,应使用equals方法,因为在自动装箱后,对于-128到127之间的值,会将他们存放在内存中重用。
Integer data1 = 100;
Integer data2 = 100;
if(data1 == data2)
System.out.println("data1 == data2");
else
System.out.println("data1 != data2");
上述代码将输出“data1 != data2”,因为100将存放在内存中重用,data1与data2指向的事同一块内存,data1 == data2为真。
Integer data1 = 200;
Integer data2 = 200;
if(data1 == data2)
System.out.println("data1 == data2");
else
System.out.println("data1 != data2");
然而上述代码将输出“data1 != data2”,因为两个200在内存中分别存储于不同的区域,data1 == data2为假。
当使用equals方法时,比较的是Wrapper类对象的值
Integer data1 = 200;
Integer data2 = 200;
if (i1.equals(i2))
System.out.println("data1 == data2");
else
System.out.println("data1 != data2");
上述代码输出结果为“data1 == data2”。
最后祝你身体健康,再见。