黑马程序员技术交流社区

标题: 基础类型包装类的问题 [打印本页]

作者: nicezt    时间: 2016-9-25 23:35
标题: 基础类型包装类的问题
用==比较时
Integer in1 = new Integer(1); Integer in2 = new Integer(1); in1==in2 是false
Integer in3 = 1;Integer in4 = 1;   in1==in2  是false.
第一个可以理解是两个不同的对象,所以不相等,第二种情况怎么解释呢!


作者: nicezt    时间: 2016-9-25 23:37
下面那句写错了 是Integer in3 = 1;Integer in4 = 1;   in3==in4  是false.
作者: hydome    时间: 2016-9-26 00:04
其实这是包装对象的特性: 自动装箱
Integer i = 1 等同于 Integer i = Integer.valueOf(1)


作者: 帅哥军    时间: 2016-9-26 00:36
你确定你敲出来答案是false?!!我看了是true,用Eclipse验证了也是true,截图如下:
自动拆箱都是1,自然相等!

2016-09-26_003251.png (244.05 KB, 下载次数: 27)

2016-09-26_003251.png

作者: 帅哥军    时间: 2016-9-26 00:38
刚刚截图发错了,你自己试试,好好想想!

2016-09-26_003651.png (314.4 KB, 下载次数: 18)

2016-09-26_003651.png

作者: 读书可以当饭吃    时间: 2016-9-26 01:01
没毛病,in3==in4是true
作者: huangweicong    时间: 2016-9-26 01:08
11111111111
作者: nicezt    时间: 2016-9-26 22:26
帅哥军 发表于 2016-9-26 00:38
刚刚截图发错了,你自己试试,好好想想!

Integer in1 = new Integer(1); Integer in2 = new Integer(1); in1==in2 返回时false.
创建个新对象,不是Integer in3=1;
作者: nicezt    时间: 2016-9-26 22:46
hydome 发表于 2016-9-26 00:04
其实这是包装对象的特性: 自动装箱
Integer i = 1 等同于 Integer i = Integer.valueOf(1)

我好像明白点了,Integer i = new  Integer(1);创建时有两个步骤,一个是为i在栈内存中分配空间,为Integer在堆内存中分配空间,这是创建了两个空间。而Integer i =1 只在栈中分配了一个对象。然后。。。怎么解释呢
作者: &天马星空ぁ    时间: 2016-9-27 10:50
本帖最后由 &天马星空ぁ 于 2016-9-27 10:52 编辑
nicezt 发表于 2016-9-26 22:46
我好像明白点了,Integer i = new  Integer(1);创建时有两个步骤,一个是为i在栈内存中分配空间,为Integ ...

Integer i=200; 就相当于Integer i=Integer.valueOf(200);  调用了一个自动封箱功能    而这个valueOf()方法 的返回值就是new Integer(i);   所以说Integer i=new Integer(200);和Integer i=200;是一样一样的
都是在堆内存中先创建一个对象   然后在从常量池中引用的200的地址
然而-128到127,是你在创建第一个对象时候赋值,会有一个缓存处理,在第二次赋同样的值时候,会直接调用第一次常量池中这个值得地址,所以对于Integer-128到127 ==比较会是true  超过这个值就是false
作者: nicezt    时间: 2016-9-27 14:08
&天马星空ぁ 发表于 2016-9-27 10:50
Integer i=200; 就相当于Integer i=Integer.valueOf(200);  调用了一个自动封箱功能    而这个valueOf()方 ...

从你的解释中我明白了
Integer i1=1;Integer i2=1;i1==12;是true,而
Integer i1=128;Integer i2=128;i1==12;是false.这一点学习了。
至于Integer i1=1和Integer i2=new Integer(1);还是不一样的,前者只创建了一个对象,后置创建了两个对象.前者就和你说的一样,在常量池中指向了同一块地址,而后者会在堆内存中分别开辟空间。在==比较的过程中所以后者都会返回false.

作者: Zzh94520    时间: 2016-9-27 15:10
。。。。。。。。。。。。。。。。




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