黑马程序员技术交流社区

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

作者: Ricky_Nick    时间: 2014-4-21 12:04
标题: 对于基本数据类型包装类的小疑惑点
(刚刚发的关于这个问题贴,内容没有全部显示出来,再发一次)
看看以下代码:
我们知道在定义a,b,x,y,时,基本数据类型有自动装箱的功能,
就例如Integer a=140; 就相当于Integer a=new Integer(140);
所以a==b为false都能理解
另外我们知道,如果数值范围在byte范围内,创建Integer对象时,不会开辟新的空间,而是指向已有的同一个对象
所以x==y为true也能理解

但是,既然Integer a=140; 就相当于Integer a=new Integer(140)
那么m==n的结果和x==y的结果就应该相同才对,
为什么会不同?
求对基本数据类型包装类理解比较透彻的朋友帮忙解释一下。。。。。





作者: 曹冬明    时间: 2014-4-21 12:20
你这个是显示的开辟了空间,你就是传入1,他还是false,因为地址不同!
作者: 二小傻    时间: 2014-4-21 12:23
只要new就是创建对象,地址就不同了
作者: tjsyj    时间: 2014-4-21 13:26
为了优化,虚拟机为包装类提供了缓冲池,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
作者: 陈文怀    时间: 2014-4-21 14:21
本帖最后由 陈文怀 于 2014-4-21 14:27 编辑

画了个图,希望有助于你理解,看视频应该讲的很明白了!
Integer m = 100;
Integer n = 100;
会先判断m是否在-128到127这个范围,在的话,会到缓存空间按角标取对应的值.
Integer m = new Integer(100);
Integer n = new Integer(100);
这两个肯定会在堆中开辟新空间的,只要new.

QQ截图20140421141840.jpg (88.26 KB, 下载次数: 11)

QQ截图20140421141840.jpg

作者: 李海霞java    时间: 2014-4-21 15:46
解释如下:

1.Integer a=140;
2.Integer b=140;
3.Integer x=100;
4.Integer y=100;
5.System.out.print("a==b:"+a==b);//___________false
6.System.out.print("x==y:"+x==y);//___________true//知识点:享元模式
//装箱过程,一个字节之内(-128~127)之间的数字
//包装为一个Integer对象后缓存在池里,下次再有就直接从池里查找。
//这种设计模式叫做 享元模式(flyweight)——当很多很小的对象,它们有很多属性相同,就将它们变成一个对象,不同的地方变成方法的参数传入。
7.Integer m=new Integer(100);
8.Integer n=new Integer(100);
9.System.out.print("m==n:"+m==n);//__________false//创建m,n两个对象,地址值不同







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