黑马程序员技术交流社区

标题: 装箱与拆箱的问题 [打印本页]

作者: 侠客梦的懒猫    时间: 2013-12-9 20:34
标题: 装箱与拆箱的问题
         Integer a=137;
         System.out.println("数字:"+a);
         
         Integer b=137;
         System.out.println("数字:"+b);
         System.out.println(a==b);
为什么输出的是false,是不是虽然这个值相同,但是他们是不同的对象呢?还是不太明白,求解释:)!先谢谢哦!
作者: 回音    时间: 2013-12-9 20:58
1. int类型是一种基本数据类型,其变量是放在栈内存中的。Integer是对应于int的类类型,称为对象包装,其实例是放在堆内存中的。Integer包装类的出现是为了提供关于int基本数据类型的一些方法,比如进制转换,其与字符串基本数据类型的转换等。
2. a==b的返回值是false,但a.equals(b)的返回值是true。a, b作为整形包装类的对象,==操作符的意义是比较两个对象的引用是否相同。而这两个对象的equals()方法继承于Object类,意义是比较两个对象的引用指向的对象是否相同。
3.  从内存分配的角度理解,==针对的是存储于栈内存中的引用,equals()方法针对的是存储于堆内存中的对象内容。
作者: Jim-剣◆﹏    时间: 2013-12-9 21:01
本帖最后由 Jim-剣◆﹏ 于 2013-12-9 22:02 编辑

Integer类用的是享元模式
数值在-128~+127之间的值,所指向的就是同一个对象
如果不在这个范围之内,即使数值相同,对象也不是指同一个
作者: ixiangfeng    时间: 2013-12-9 21:04
Jim-剣◆﹏ 发表于 2013-12-9 21:01
Integer类用的是享元模式
数值在-128~+128之间的值,所指向的就是同一个对象
如果不在这个范围之内,即使数 ...

+127吧?
作者: 刘敏    时间: 2013-12-9 21:38
本帖最后由 刘敏 于 2013-12-9 21:39 编辑

Java虚拟机 默认给Integer在常量区给出了-128~127的值,当两个Integer的对象值在这个范围内的时候,比如110,这两个对象引用都指向常量区110的地址;但当对象的值超过127,比如150 的时候,就需要在堆上新new 两个值为150 的对象,这时候 对象引用的值就分别指向堆上的两个地址了。总的来说,在-128~127,Integer的引用都指向常量区,超过就要在堆上new对象。

作者: Jim-剣◆﹏    时间: 2013-12-9 22:01
ixiangfeng 发表于 2013-12-9 21:04
+127吧?

:lol手快打错,谢谢提醒
作者: 侠客梦的懒猫    时间: 2013-12-13 11:45
懂了,谢谢各位




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