A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 移动小坦克 中级黑马   /  2013-3-10 13:11  /  1199 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韩松范 于 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 20:15

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
首先先说一下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在,就会在堆中开辟一个空间,也就是新建立一个对象!

评分

参与人数 1技术分 +1 黑马币 +9 收起 理由
黄玉昆 + 1 + 9

查看全部评分

回复 使用道具 举报
本帖最后由 邹学良 于 2013-3-10 14:28 编辑

跟楼上的观点有所不同
i4 == i5 + i6因为有"+"运算符参与,Java在对i5和i6进行拆箱加法运算操作时,是在栈内存中进行的,而这个时候在栈内存中i4,i5,i5作为int数据类型,“==”符比较的也不再是地址值了,而是直接运算i4 == i5 + i6拆箱后的基本类型值是否相等,根本不用再去i4和运算后结果的引用比较了!
i1 == i2 + i3比较时内部也是这种运算操作

评分

参与人数 1技术分 +1 黑马币 +9 收起 理由
黄玉昆 + 1 + 9

查看全部评分

回复 使用道具 举报
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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马