http://topic.csdn.net/t/20050325/08/3879427.html
題目:
Integer?? i?? =?? new?? Integer(42)??
? Long?? l?? =?? new?? Long(42)??
? Double?? d?? =?? new?? Double(42.0)??
? 下面哪些返回true??
? 1:?? i==l??
? 2:?? i==d??
? 3:?? l==d??
? 4:i.equals(l)??
? 5:i.equals(d)??
? 6:l.equals(d)??
? 7:i.equals(42)??
答案:7;
編碼驗(yàn)證:
? public?? class?? Equivalence?? {??
? public?? static?? void?? main(String[]?? args)?? {??
? Integer?? i?? =?? new?? Integer(42)??
? Long?? l?? =?? new?? Long(42)??
? Double?? d?? =?? new?? Double(42.0)??
? System.out.println(i==l);??
? System.out.println(i==d);
? System.out.println(l==d);??
? System.out.println(i.equals(l) );???
? System.out.println(i.equals(d) );
? System.out.println(l.equals(d) );??
? System.out.println(i.equals(42));
? }??
? }?
運(yùn)行結(jié)果:
1-3:編譯不通過(guò);
4-6:false
7:true
原理解釋?zhuān)?br />呵呵,我從thinking?? in?? java電子版中摘了一段:??
? 1.?? 檢查對(duì)象是否相等??
? 關(guān)系運(yùn)算符==和!=也適用于所有對(duì)象,但它們的含義通常會(huì)使初涉Java領(lǐng)域的人找不到北。下面是一個(gè)例子:??
???
???
? //:?? Equivalence.java??
???
? public?? class?? Equivalence?? {??
? public?? static?? void?? main(String[]?? args)?? {??
? Integer?? n1?? =?? new?? Integer(47);??
? Integer?? n2?? =?? new?? Integer(47);??
? System.out.println(n1?? ==?? n2);??
? System.out.println(n1?? !=?? n2);??
? }??
? }?? ///:~??
???
? 其中,表達(dá)式System.out.println(n1?? ==?? n2)可打印出內(nèi)部的布爾比較結(jié)果。一般人都會(huì)認(rèn)為輸出結(jié)果肯定先是true,再是false,因?yàn)閮蓚€(gè)Integer對(duì)象都是相同的。但盡管對(duì)象的內(nèi)容相同,句柄卻是不同的,而==和!=比較的正好就是對(duì)象句柄。所以輸出結(jié)果實(shí)際上先是false,再是true。這自然會(huì)使第一次接觸的人感到驚奇。??
? 若想對(duì)比兩個(gè)對(duì)象的實(shí)際內(nèi)容是否相同,又該如何操作呢?此時(shí),必須使用所有對(duì)象都適用的特殊方法equals()。但這個(gè)方法不適用于“主類(lèi)型”,那些類(lèi)型直接使用==和!=即可。下面舉例說(shuō)明如何使用:??
???
???
? //:?? EqualsMethod.java??
???
? public?? class?? EqualsMethod?? {??
? public?? static?? void?? main(String[]?? args)?? {??
? Integer?? n1?? =?? new?? Integer(47);??
? Integer?? n2?? =?? new?? Integer(47);??
? System.out.println(n1.equals(n2));??
? }??
? }?? ///:~??
???
? 正如我們預(yù)計(jì)的那樣,此時(shí)得到的結(jié)果是true。但事情并未到此結(jié)束!假設(shè)您創(chuàng)建了自己的類(lèi),就象下面這樣:??
???
???
? //:?? EqualsMethod2.java??
???
? class?? Value?? {??
? int?? i;??
? }??
???
? public?? class?? EqualsMethod2?? {??
? public?? static?? void?? main(String[]?? args)?? {??
? Value?? v1?? =?? new?? Value();??
? Value?? v2?? =?? new?? Value();??
? v1.i?? =?? v2.i?? =?? 100;??
? System.out.println(v1.equals(v2));??
? }??
? }?? ///:~??
???
? 此時(shí)的結(jié)果又變回了false!這是由于equals()的默認(rèn)行為是比較句柄。所以除非在自己的新類(lèi)中改變了equals(),否則不可能表現(xiàn)出我們希望的行為。不幸的是,要到第7章才會(huì)學(xué)習(xí)如何改變行為。但要注意equals()的這種行為方式同時(shí)或許能夠避免一些“災(zāi)難”性的事件。??
? 大多數(shù)Java類(lèi)庫(kù)都實(shí)現(xiàn)了equals(),所以它實(shí)際比較的是對(duì)象的內(nèi)容,而非它們的句柄。
?
我也來(lái)說(shuō)說(shuō)自己的認(rèn)識(shí)把。??
???
? 在java中內(nèi)存分為?? “棧”和“堆”(Stack?? and?? Heap)?? 基本數(shù)據(jù)類(lèi)型存儲(chǔ)在?? "棧"中??
? 對(duì)象引用類(lèi)型實(shí)際存儲(chǔ)在?? "堆"中,在“棧”中只是保留引用內(nèi)存的地址值,就好像知道你家門(mén)牌號(hào)碼就可以找到你家。??
???
? 在Java中利用"=="比較變量時(shí)候,系統(tǒng)使用變量在stack(棧)中所存的值來(lái)作為對(duì)比的依據(jù),基本數(shù)據(jù)類(lèi)型(int?? float?? double????
???
? boolean)在stack中所存的值就是其內(nèi)容值,而引用類(lèi)型在stack中所存放的值是本身所指向Heap中對(duì)象的地址值,而不是原先所設(shè)定的值。??