自動裝箱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