首先先说一下jdk1.5的新特性
Integer x = 4;//自动装箱
x = x+2;//x进行了自动拆箱,变成了int类型,和2进行加法运算
//再将和进行装箱赋给x;
所以你代码中System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));
这句话的执行过程是:i5+i6//实际上是先将i5和i6自动拆箱,变成两个基本数据类型,求得它们的和,这个和的是一个基本数据类型,然后要赋值给i4,可是i4是一个引用数据类型,所以这时候又执行了一次自动装箱。这个时候,又利用了另一个新特性,就是建立一个Integer引用时,如果它的数值在byte范围内,对于新特性,如果该数值已经存在,则不会开辟新空间。而此时i5+i6的和的值是40,这个值已经存在,所以不创建新对象。所以这个语句输出结果为true。
最后提一点:对于Integer x = new Integer(n;//对于这样创建Integer对象的,创建的数值n的值是多少(整型范围内),只要有new在,就会在堆中开辟一个空间,也就是新建立一个对象! |