自动拆箱和装箱仅适用于JDK1.5(包括1.5)以后的版本。它只是编译阶段的概念而与程序的运行无关,主要目的是方便程序员编码,提高效率。
public class AutoBox {
public static void main(String[] args) {
//JDK1.4以前的装箱和拆箱
//装箱-基本类型装换成封装类型
Integer it = new Integer(10);
//拆箱-封装类型装换成基本类型
int i = it.intValue();
//JDK1.5以后
Integer i1=5;//自动装箱
System.out.println(i1);
int i2=it;//自动拆箱
System.out.println(i2);
}
}
注意:比较两个Integer类型的数据不能使用“==”,要使用方法equals()。
public class AutoBoxCompare {
public static void main(String[] args) {
Integer i1=128;
Integer i2=128;
System.out.println(i1==i2);//false
System.out.println(i1.equals(i2));//true
//上述两式相当于
Integer i3=new Integer(128);
Integer i4=new Integer(128);
System.out.println(i3==i4);//false
//需要注意的是
Integer i5=127;
Integer i6=127;
System.out.println(i5==i6);//true
Integer i7=-128;
Integer i8=-128;
System.out.println(i7==i8);//true
Integer i9=-129;
Integer i10=-129;
System.out.println(i9==i10);//false
}
}
通过上面代码注意到Integer类的比较“==”比较的是对象,也可以说是地址,equals()比较的就是内容了。还有就是比较奇怪的地方是当Integer在-128-127取值时比较两个对象返回的是true,原因与String类类似,但又有所不同,对于Integer类来说,当数据位于-128-127时,java会引入一个“整形常量池”,该整形常量池只存储-127~128的数据,当超过这个数据时,会在堆中建立一个对象,所以直接比较对象的话由于地址不同会报错。
String类可以参考 String类详解