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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李红飞 中级黑马   /  2012-5-23 09:58  /  1714 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Integer i1=100;
Integer i2=100;
Integer i3=200;
Integer i4=200;
System.out.println(i1==i2);  //true
System.out.println(i1==i2);   //false\
求结果具体原因?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 看看老毕和张老师基本数据类型包装类.

查看全部评分

5 个回复

倒序浏览
基本数据类型的对象缓存:它对于基本数据类型的整数,要装箱成为Integer对象时,如果这个数字在一个字节之内,也就是-128到127之间的数字,一旦被包装成Integer对象之后,就会把它缓存起来,在一个池里面,当下次又要把一个整数包装成Integer对象的时候,就会先到缓存池里面找,如果有就冲缓存池里面取,这样就节省了内存空间。这是一种设计模式:享元模式(flyweight)
对于整数在-128到127之间的数,被包装成Integer对象后,System.out.println(i1==i2);都会返回真(true).不在此范围内的整数,都会返回假(false)

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马—陈磊 于 2012-5-23 10:40 编辑

"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,
所以范例中,i1与 i2实际上参考至同一个对象。
如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,
即相当于每次装箱时都新建一个 Integer对象,所以范例中,i3与i4参考的是不同的对象。
另外,当不使用自动装箱功能的时候,情况与普通类对象一样.
回复 使用道具 举报
你写错了吧? 结果怎么可能为false.....
回复 使用道具 举报
jdk1.5新特性:基本数据类型的自动装箱和拆箱,基本数据类型和它所对应的包装类可以自动转换,
如果一个数值在一个字节之内(-128~127之间的数值),那么在自动装箱的时候系统会把这个包装类对象缓存起来,如果下一次同样的数值需要自动装箱,那么就直接引用之前缓存起来的那个数值相同的对象。
Integer i1=100;Integer i2=100;Integer i3=200;Integer i4=200;
System.out.println(i1==i2);  //true因为100是在一个字节之内,就只有一个对象
System.out.println(i1==i2);  这里运行结果也是true的
System.out.println(i3==i4); 这句因为200已经超出了一个字节,就创建了两个对象,运行结果就是false
以上就是java中的享元模式(flyweight): 有很多个小的对象,他们有很多属性相同,就把他们变成一个对象,
那些不同的属性就设为方法的参数传进来,叫外部属性或外部状态。享元模式会大幅度的降低内存中对象的数量。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
四个字,享元模式
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马