自动装箱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