黑马程序员技术交流社区
标题:
基本数据类型包装类的小疑惑
[打印本页]
作者:
Ricky_Nick
时间:
2014-4-21 11:53
标题:
基本数据类型包装类的小疑惑
/*对于下面的代码结果,我的理解是有一个小疑惑点*/
Integer a=140;
Integer b=140;
Integer x=100;
Integer y=100;
System.out.print("a==b:"+a==b);//___________false
System.out.print("x==y:"+x==y);//___________true
Integer m=new Integer(100);
Integer n=new Integer(100);
System.out.print("m==n:"+m==n);//__________false
/*我们知道在定义a,b,x,y,时,基本数据类型有自动装箱的功能,
就例如
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