黑马程序员技术交流社区
标题:
1.5新特性自动装箱拆箱问题
[打印本页]
作者:
冯建鹏
时间:
2012-3-21 20:09
标题:
1.5新特性自动装箱拆箱问题
Integer int=5;
Integer int1=5;
System.out.print(int==int1)//正确
Integer int2=165;
Integer int3=165;
System.out.print(int2==int3)//错误 为什么呢?请说的具体点谢谢
作者:
陈从宾
时间:
2012-3-21 20:26
本帖最后由 陈从宾 于 2012-3-21 20:28 编辑
在一个字节-128--127之内的数字,一旦包装成Integer对象是将它们缓存起来,您的好像超出范围了
自动装箱其实就是编译器编译的时候,自动帮你把int变成Integer对象,调用的是Integer的静态方法valueOf(),当你调用这个方法,把int变成Integer的时候,是有规则的,当你的int的值在-128-IntegerCache.high(127) 时,返回的不是一个新new出来的Integer对象,而是一个已经缓存在堆中的Integer对象
作者:
Destiny
时间:
2012-3-21 20:26
这与==运算符的比较有关,==是用来比较两个基本数据类型的变量值是否相等,事实上==也用于判断两个对象引用名称是否参考至同一个对象。
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以使用==进行比较时,int 与 int1 实际上参考至同一个对象。
如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以第二个使用==进行比较时,i1与i2参考的是不同的对象。
这样写就不会出错了:
public static void main(String[] args) {
Integer i1 = 200;
Integer i2 = 200;
if (i1.equals(i2))
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
作者:
周建
时间:
2012-3-21 21:07
首先在1.5之前都是这样写Integer int=new Integer(5);1.5之后增加了自动封箱功能可以简写为Integer int=5;意思一样;在Java中new就代表重新创建一个对象,而在自动装箱时对于值从–128到127之间的值,实际开发使用的非常多,Java工程师们就设计了这个新的模式,让其被封装成对象后内存中被重用,这样再次创建一个相同的对象时现在内存中查找,如果已经存在就获取已经存在的地址值,此时就是两个类类型的变量指向同一个对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2