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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯建鹏 黑马帝   /  2012-3-21 20:09  /  1816 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Integer int=5;
Integer int1=5;
System.out.print(int==int1)//正确
Integer int2=165;
Integer int3=165;
System.out.print(int2==int3)//错误 为什么呢?请说的具体点谢谢

3 个回复

倒序浏览
本帖最后由 陈从宾 于 2012-3-21 20:28 编辑

在一个字节-128--127之内的数字,一旦包装成Integer对象是将它们缓存起来,您的好像超出范围了
自动装箱其实就是编译器编译的时候,自动帮你把int变成Integer对象,调用的是Integer的静态方法valueOf(),当你调用这个方法,把int变成Integer的时候,是有规则的,当你的int的值在-128-IntegerCache.high(127) 时,返回的不是一个新new出来的Integer对象,而是一个已经缓存在堆中的Integer对象

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
     这与==运算符的比较有关,==是用来比较两个基本数据类型的变量值是否相等,事实上==也用于判断两个对象引用名称是否参考至同一个对象。
      在自动装箱时对于值从–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");
}
}
回复 使用道具 举报
首先在1.5之前都是这样写Integer int=new Integer(5);1.5之后增加了自动封箱功能可以简写为Integer int=5;意思一样;在Java中new就代表重新创建一个对象,而在自动装箱时对于值从–128到127之间的值,实际开发使用的非常多,Java工程师们就设计了这个新的模式,让其被封装成对象后内存中被重用,这样再次创建一个相同的对象时现在内存中查找,如果已经存在就获取已经存在的地址值,此时就是两个类类型的变量指向同一个对象

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马