黑马程序员技术交流社区

标题: 基本数据类型包装类的小疑惑 [打印本页]

作者: Ricky_Nick    时间: 2014-4-21 11:53
标题: 基本数据类型包装类的小疑惑
  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);
复制代码

作者: Ricky_Nick    时间: 2014-4-21 12:05
这个代码插入,没有显示全部内容,重新发了一下
作者: tjsyj    时间: 2014-4-21 12:21
本帖最后由 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

作者: z1342802487    时间: 2014-4-21 12:25
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);
                        }
        }。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2