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;


編碼驗證:
? 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));
? }??
? }?

運行結果:

1-3:編譯不通過;
4-6:false
7:true

原理解釋:
呵呵,我從thinking?? in?? java電子版中摘了一段:??
? 1.?? 檢查對象是否相等??
? 關系運算符==和!=也適用于所有對象,但它們的含義通常會使初涉Java領域的人找不到北。下面是一個例子:??
???
???
? //:?? 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);??
? }??
? }?? ///:~??
???
? 其中,表達式System.out.println(n1?? ==?? n2)可打印出內部的布爾比較結果。一般人都會認為輸出結果肯定先是true,再是false,因為兩個Integer對象都是相同的。但盡管對象的內容相同,句柄卻是不同的,而==和!=比較的正好就是對象句柄。所以輸出結果實際上先是false,再是true。這自然會使第一次接觸的人感到驚奇。??
? 若想對比兩個對象的實際內容是否相同,又該如何操作呢?此時,必須使用所有對象都適用的特殊方法equals()。但這個方法不適用于“主類型”,那些類型直接使用==和!=即可。下面舉例說明如何使用:??
???
???
? //:?? 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));??
? }??
? }?? ///:~??
???
? 正如我們預計的那樣,此時得到的結果是true。但事情并未到此結束!假設您創建了自己的類,就象下面這樣:??
???
???
? //:?? 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));??
? }??
? }?? ///:~??
???
? 此時的結果又變回了false!這是由于equals()的默認行為是比較句柄。所以除非在自己的新類中改變了equals(),否則不可能表現出我們希望的行為。不幸的是,要到第7章才會學習如何改變行為。但要注意equals()的這種行為方式同時或許能夠避免一些“災難”性的事件。??
? 大多數Java類庫都實現了equals(),所以它實際比較的是對象的內容,而非它們的句柄。

?


我也來說說自己的認識把。??
???
? 在java中內存分為?? “棧”和“堆”(Stack?? and?? Heap)?? 基本數據類型存儲在?? "棧"中??
? 對象引用類型實際存儲在?? "堆"中,在“棧”中只是保留引用內存的地址值,就好像知道你家門牌號碼就可以找到你家。??
???
? 在Java中利用"=="比較變量時候,系統使用變量在stack(棧)中所存的值來作為對比的依據,基本數據類型(int?? float?? double????
???
? boolean)在stack中所存的值就是其內容值,而引用類型在stack中所存放的值是本身所指向Heap中對象的地址值,而不是原先所設定的值。??