自動(dòng)裝箱trick
自動(dòng)裝箱trick看以下代碼:
Integer y = 567;
Integer x =y;
System.out.println(y==x);
y++;
System.out.println(x+" "+y);
System.out.println(y==x);
第一個(gè)y==x理所當(dāng)然的是true了,因?yàn)閤和y引用了同一個(gè)Integer對(duì)象。執(zhí)行y++后,自然y就變成568了,那么在這個(gè)時(shí)候y==x是什么值呢?如果你認(rèn)為是true,那就錯(cuò)了。
y++這個(gè)操作可以分解為3個(gè)操作:拆箱、使用、重新裝箱,相當(dāng)于:
int x2 = y.intValue();
x2++;
y = new Integer(x2);
因此y在這個(gè)時(shí)候已經(jīng)不是引用原來的那個(gè)對(duì)象,而是引用了一個(gè)新的對(duì)象了。
再看一個(gè):
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different Object");
if(i1.equals(i2))System.out.println("meaningfully equal");
毫無疑問,會(huì)打印:
different Object
meaningfully equal
因?yàn)閕1和i2雖然它們的值相同,但引用的并不是同一個(gè)對(duì)象。
然而:
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same Object");
if(i1.equals(i2))System.out.println("meaningfully equal");
會(huì)打?。?br /> same Object
meaningfully equal
你也許會(huì)感到有點(diǎn)暈了吧?這是為什么呢?
Java里面為了節(jié)省內(nèi)存,對(duì)于包裝器的兩個(gè)實(shí)例,當(dāng)他們的基本值相同使,它們總是==的關(guān)系:
參考:《SCJP考試指南 310-065》http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx
Integer y = 567;
Integer x =y;
System.out.println(y==x);
y++;
System.out.println(x+" "+y);
System.out.println(y==x);
第一個(gè)y==x理所當(dāng)然的是true了,因?yàn)閤和y引用了同一個(gè)Integer對(duì)象。執(zhí)行y++后,自然y就變成568了,那么在這個(gè)時(shí)候y==x是什么值呢?如果你認(rèn)為是true,那就錯(cuò)了。
y++這個(gè)操作可以分解為3個(gè)操作:拆箱、使用、重新裝箱,相當(dāng)于:
int x2 = y.intValue();
x2++;
y = new Integer(x2);
因此y在這個(gè)時(shí)候已經(jīng)不是引用原來的那個(gè)對(duì)象,而是引用了一個(gè)新的對(duì)象了。
再看一個(gè):
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different Object");
if(i1.equals(i2))System.out.println("meaningfully equal");
毫無疑問,會(huì)打印:
different Object
meaningfully equal
因?yàn)閕1和i2雖然它們的值相同,但引用的并不是同一個(gè)對(duì)象。
然而:
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same Object");
if(i1.equals(i2))System.out.println("meaningfully equal");
會(huì)打?。?br /> same Object
meaningfully equal
你也許會(huì)感到有點(diǎn)暈了吧?這是為什么呢?
Java里面為了節(jié)省內(nèi)存,對(duì)于包裝器的兩個(gè)實(shí)例,當(dāng)他們的基本值相同使,它們總是==的關(guān)系:
- 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 閱讀(94) 評(píng)論(0) 編輯 收藏