黑马程序员技术交流社区
标题:
Integer对象在运算后在内存中如何变化?
[打印本页]
作者:
王龙彪
时间:
2012-7-20 18:52
标题:
Integer对象在运算后在内存中如何变化?
本帖最后由 王龙彪 于 2012-7-21 02:42 编辑
public static void autoBoxTest()
{
Integer x = 12;
Integer y = 12;
sop(y == x);//true
x += 1;
sop(x + "...." + y);
y += 1;
sop(x + "...." + y);
sop(y == x);//为什么又是true了 呢?
}
复制代码
作者:
龚建锋
时间:
2012-7-20 19:00
程序是从主函数入口,然后自上而下执行,上面x+=1——x=x+1=12+1=13,y+=1——y=y+1=12+1=13都已经执行,并重新有了值.当你输出(y==x)时,程序判断x和y的值还是相等,所以输出true.
作者:
王宝康
时间:
2012-7-20 19:08
这是JDK1.5中的自动装箱拆箱啊,建议你看下张孝祥老师的基础加强视频,其中有讲到这个的。
作者:
温少邦
时间:
2012-7-20 20:03
如果是自动装箱的话,
会判断是否在-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了
作者:
罗宵
时间:
2012-7-20 21:07
特殊情况:当这个整数在一个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指向的还是同一个对象。地址值相同。
作者:
罗宵
时间:
2012-7-20 21:08
特殊情况:直接赋值,当这个整数在一个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指向的还是同一个对象。地址值相同。
作者:
程潇
时间:
2012-7-21 11:34
本帖最后由 程潇 于 2012-7-21 11:46 编辑
public static void autoBoxTest()
{
Integer x = 12;
Integer y = 12;
sop(y == x);//
这里比较的是两个对象的引用,比较对象引用的话,就是判断他们是否指向同一个对象。在这里他们都指向了常量池中的12,所以结果为true
x += 1;
sop(x + "...." + y);
y += 1;
sop(x + "...." + y);
sop(y == x);//
这里同上,经过运算以后,x和y又都同时指向了常量池中的13,所以结果还是true
}
补充:关于常量池
常量池是一个可变长度cp_info表的有序序列。cp_info表一共有11中类型,分别表示不同的数据类型,用来存放不同数据类型的常量。
其中关于Integer类型的表是CONSTANT_Integer_info表,是一个固定长度的表,表中有一个bytes项,用来存储int类型的值,其长度就是一个字节。
因此,如果程序中x和y的值的范围在一个字节的范围内,即-128~127时,他们都会指向这个值在常量池中的存储位置,进而x==y为true。如果x和y 的值超出一个字节,那么他们的值超出了常量池能够存储的表数范围,那么x和y指向的地址就不是数值在常量池中的位置了,x和y所指向的地址就不一样了,进而x==y为false。
推荐你看看这篇博客:
http://blog.sina.com.cn/s/blog_5da93c8f0100t39b.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2