黑马程序员技术交流社区
标题:
和常量池有关的题目。。。
[打印本页]
作者:
移动小坦克
时间:
2013-3-10 13:11
标题:
和常量池有关的题目。。。
本帖最后由 韩松范 于 2013-3-10 13:13 编辑
前面的大概都明白,就是不明白最后一个,
System.out.println(
"i4=i5+i6\t"
+ (i4 == i5 + i6));
为什么会相等。。。。好像跟自动拆箱,装箱有关。。。。。。
当然也不介意,把前面的也解释一遍
public class IntegerTest {
public static void main(String[] args) {
objPoolTest();
}
public static void objPoolTest() {
Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
System.out.println("i1=i2\t" + (i1 == i2));
System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));
System.out.println("i4=i5\t" + (i4 == i5));
System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));
System.out.println();
}
}
输出结果为:
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