黑马程序员技术交流社区

标题: 和常量池有关的题目。。。 [打印本页]

作者: 移动小坦克    时间: 2013-3-10 13:11
标题: 和常量池有关的题目。。。
本帖最后由 韩松范 于 2013-3-10 13:13 编辑


输出结果为:

i1=i2true
i1=i2+i3   true
i4=i5    false
i4=i5+i6   true



作者: 张豪杰    时间: 2013-3-10 13:27
首先先说一下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在,就会在堆中开辟一个空间,也就是新建立一个对象!
作者: 邹学良    时间: 2013-3-10 14:27
本帖最后由 邹学良 于 2013-3-10 14:28 编辑

跟楼上的观点有所不同
i4 == i5 + i6因为有"+"运算符参与,Java在对i5和i6进行拆箱加法运算操作时,是在栈内存中进行的,而这个时候在栈内存中i4,i5,i5作为int数据类型,“==”符比较的也不再是地址值了,而是直接运算i4 == i5 + i6拆箱后的基本类型值是否相等,根本不用再去i4和运算后结果的引用比较了!
i1 == i2 + i3比较时内部也是这种运算操作
作者: 王亚东    时间: 2013-3-10 15:04
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
i4 == i5 + i6
i5和i6本来是引用类型,使用+运算符时,自动拆箱为int(40+0 = 40),结果是:i4 ==40
i4本来也是引用类型,和int比较时,也拆箱为int:40 == 40  true




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2