dream.in.java

能以不变应万变是聪明人做事的准则。万事从小事做起,积累小成功,问鼎大成功,是成功者的秘诀。

自动装箱trick

自动装箱trick

看以下代码:

Integer y = 567;
Integer x =y;
System.out.println(y==x);
y++;
System.out.println(x+" "+y);
System.out.println(y==x);

第一个y==x理所当然的是true了,因为x和y引用了同一个Integer对象。执行y++后,自然y就变成568了,那么在这个时候y==x是什么值呢?如果你认为是true,那就错了。

y++这个操作可以分解为3个操作:拆箱、使用、重新装箱,相当于:

int x2 = y.intValue();
x2++;
y = new Integer(x2);

因此y在这个时候已经不是引用原来的那个对象,而是引用了一个新的对象了。

再看一个:
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different Object");
if(i1.equals(i2))System.out.println("meaningfully equal");

毫无疑问,会打印:
different Object
meaningfully equal

因为i1和i2虽然它们的值相同,但引用的并不是同一个对象。

然而:
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same Object");
if(i1.equals(i2))System.out.println("meaningfully equal");

会打印:
same Object
meaningfully equal

你也许会感到有点晕了吧?这是为什么呢?

Java里面为了节省内存,对于包装器的两个实例,当他们的基本值相同使,它们总是==的关系:

  • Boolean
  • Byte
  • 从\u0000到\u007f的字符串
  • -128到127的Short和Integer


参考:《SCJP考试指南 310-065》http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx

posted on 2009-03-19 00:09 YXY 阅读(90) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: