黑马程序员技术交流社区
标题: 关于基本数据类型包装类中Integer包装类的疑问!!!求高... [打印本页]
作者: yinxjfly 时间: 2014-4-26 12:28
标题: 关于基本数据类型包装类中Integer包装类的疑问!!!求高...
程序如下,
class autoBox
{
public static void main(String[] args)
{
Integer x=new Integer(127);
Integer y=new Integer(127);
System.out.println("x==y:"+(x==y));
Integer a=127;//自动装箱,等价于Integer a=new Integer(127);
Integer b=127;//自动装箱,等价于Integer b=new Integer(127);
System.out.println("a==b:"+(a==b));
}
}
运行结果:x==y:false
a==b:true
问题是,对于Integer包装类的事例化对象x和y,当实例化对象的数值在byte范围内时,在JDK1.5版本之后,如果该数值已近存在,则x与y的引用会指向同一个对象,但为什么在程序运行后x和y并没有指向同一个实例化对象,而a和b却指向了同一个实例化对象?
作者: 水竹 时间: 2014-4-26 12:56
- class autoBox
- {
- public static void main(String[] args)
- {
- Integer x=new Integer(127);
- Integer y=new Integer(127);
- System.out.println("x="+(++x)+"y="+y);
-
- Integer a=127;//自动装箱,等价于Integer a=new Integer(127);
- Integer b=127;//自动装箱,等价于Integer b=new Integer(127);
- System.out.println("a="+(++a)+"b="+b);
- }
- }
复制代码
运行一个试试,你会发现你的提问有问题。
作者: 你为谁归来 时间: 2014-4-26 13:10
new等同于新建对象。xy都使用了new创建了2个新的对象。我是这么理解的!
作者: 轻语。 时间: 2014-4-26 13:17
本帖最后由 伍叶竹 于 2014-4-26 13:19 编辑
Integer m = 128;
Integer n = 128;
sop("m==n : "+(m==n)); // false 因为是两个不同的对象
当数值在byte范围内(-128~127)时,对于新特性,如果该数值已经存在,则不会再开辟新的空间,
因此,a和b指向同一个Integer对象
但是,如果是通过 new 出来的对象,还是两个独立的对象
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
sop("a==b : "+(a==b)); // false
sop("x.equals(y) : "+x.equals(y)); // true Integer中 equals方法:
比较此对象与指定对象。当且仅当参数不为 null,
并且是一个与该对象包含相同 int 值的 Integer 对象时,结果为 true。
作者: yinxjfly 时间: 2014-4-26 13:25
不太明白你的意思!我初学,多指教!
作者: yinxjfly 时间: 2014-4-26 13:30
多谢你的回答!
a与b直接赋值初始化不是也等同于分别new了一个对象,但是赋值内容都在byte范围内时,为什么x与y就指向不同的引用,而a与b则指向同一个应用
作者: 你为谁归来 时间: 2014-4-26 23:47
SORRY,我没说清楚。我附加一段代码给你看下。
- public class Demo6
- {
- public static void main(String[] args)
- {
- Integer x=new Integer(127);
- Integer y=new Integer(127);
- System.out.println(x.equals(y));
- System.out.println("x==y:"+(x==y));
- Integer a=127;//自动装箱,等价于Integer a=new Integer(127);
- Integer b=127;//自动装箱,等价于Integer b=new Integer(127);
- System.out.println(a.equals(b));
- System.out.println("a==b:"+(a==b));
- }
- }
复制代码
结果:
true
x==y:false
true
a==b:true
虽然Integer i = 100; 相当于编译器自动作的语法编译:Integer i = new Integer(100);
但是当不使用自动装箱功能的时候,情况与普通类对象一样。new2次就是2个对象。他们的地址值
是不一样的。但是你使用了自动装箱操作就一样的了。最后给你了博客http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html
你自己看下就知道了,上面说的比较清楚了!呵呵!
作者: yinxjfly 时间: 2014-4-27 00:59
多谢多谢!这个问题困扰我好几天了!:handshake
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |