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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Ricky_Nick 中级黑马   /  2014-4-21 11:53  /  865 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*对于下面的代码结果,我的理解是有一个小疑惑点*/
  2. Integer a=140;
  3. Integer b=140;
  4. Integer x=100;
  5. Integer y=100;
  6. System.out.print("a==b:"+a==b);//___________false
  7. System.out.print("x==y:"+x==y);//___________true
  8. Integer m=new Integer(100);
  9. Integer n=new Integer(100);
  10. System.out.print("m==n:"+m==n);//__________false
  11. /*我们知道在定义a,b,x,y,时,基本数据类型有自动装箱的功能,
  12. 就例如
  13. Integer a=140; 就相当于Integer a=new Integer(140);
复制代码

3 个回复

倒序浏览
这个代码插入,没有显示全部内容,重新发了一下
回复 使用道具 举报
本帖最后由 tjsyj 于 2014-4-21 12:23 编辑

为了优化,虚拟机为包装类提供了缓冲池,Integer池的大小-128~127 一个字节的大小;

Integer m=new Integer(100);
Integer n=new Integer(100);
System.out.print("m==n:"+m==n);//__________false   因为 m和n是两个不同的对象 ,==比较的是两个数的地址 所以 返回false

Integer x=100; Integer y=100;
实际上调用的是Integer.valueOf(int x); 和 Integer.valueOf(int y)
因为从-127到128之间的Integer数,Java在Integer中有事先缓存好的原型对象,每次返回的都是同一个Integer对象,只有不在这个范围的数才会new出一个Integer. 所以 返回的是 true
回复 使用道具 举报
java在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以使用==进行比较时,x和y实际上引用同一个对象x==y true。如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以使用==进行比较时,a和b引用的是不同的对象。当new的时候,不管内存中是不是相同引用的对象,jvm都会新建立新的对象扎m==n false
这就是所谓java自动装箱陷阱
public class Test
        {
                public static void main(String args[])
                        {
                                Integer a = 140;
                                Integer b = 140;
                                Integer x = 100;
                                Integer y = 100;
                                System.out.println(a == b);
                                System.out.println(x == y);
                                Integer m = new Integer(100);
                                Integer n = new Integer(100);
                                System.out.println(m == n);
                        }
        }。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马