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

© 王龙彪 中级黑马   /  2012-7-20 18:52  /  2980 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王龙彪 于 2012-7-21 02:42 编辑
  1. public static void autoBoxTest()
  2. {
  3.         Integer x = 12;
  4.         Integer y = 12;        
  5.         sop(y == x);//true
  6.         x += 1;
  7.         sop(x + "...." + y);
  8.         y += 1;        
  9.         sop(x + "...." + y);
  10.         sop(y == x);//为什么又是true了 呢?
  11. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
程序是从主函数入口,然后自上而下执行,上面x+=1——x=x+1=12+1=13,y+=1——y=y+1=12+1=13都已经执行,并重新有了值.当你输出(y==x)时,程序判断x和y的值还是相等,所以输出true.
回复 使用道具 举报
这是JDK1.5中的自动装箱拆箱啊,建议你看下张孝祥老师的基础加强视频,其中有讲到这个的。
回复 使用道具 举报
如果是自动装箱的话,
会判断是否在-128~127之内
在这个范围的话,类似String的处理,
会将Integer对象存在内存中,

所以Integer x=12;Integer y=12;
这里x,y其实指向一个对象,

而x+=1;的执行我想应该是这样:
x.intValue()+1计算出一个int类型的值
而后赋给x,中间也有自动装箱的过程
所以最后x,y也是同一个对象

如果把x,y初始值换成128以上的,就可以看到2个都是false了

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
特殊情况:当这个整数在一个byte的范围内时,它就不在重新创建了.直接使用.
Integer x = 12;

04.        Integer y = 12;        

05.        sop(y == x);//true

06.        x += 1;

07.        sop(x + "...." + y);

08.        y += 1;        

09.        sop(x + "...." + y);

10.        sop(y == x);
首先Integer x = 12;Integer y = 12; 都是在byte范围内,所以x,y指向的是同一个对象。之后x+1,y+1;这个过程有个自动拆箱,将Integer 转成int型,运算完后在自动装箱成Integer 类型。即为Integer x = 13;Integer y = 13;还是都在byte范围内,所以x,y指向的还是同一个对象。地址值相同。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
特殊情况:直接赋值,当这个整数在一个byte的范围内时,它就不在重新创建了.直接使用.
Integer x = 12;

04.        Integer y = 12;        

05.        sop(y == x);//true

06.        x += 1;

07.        sop(x + "...." + y);

08.        y += 1;        

09.        sop(x + "...." + y);

10.        sop(y == x);
首先Integer x = 12;Integer y = 12; 都是在byte范围内,所以x,y指向的是同一个对象。之后x+1,y+1;这个过程有个自动拆箱,将Integer 转成int型,运算完后在自动装箱成Integer 类型。即为Integer x = 13;Integer y = 13;还是都在byte范围内,所以x,y指向的还是同一个对象。地址值相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马