equals()方法個人理解

          Posted on 2009-08-08 12:38 BBT_soft 閱讀(2053) 評論(6)  編輯  收藏

          《think in java》中有這么一段話:

          如果想比較兩個對象的實際內容是否相同,又該如何操作呢?此時,必須使用所有對象都使用的特殊方法equals()。但這個方法不適用于"基本類型",基本類型直接使用==和!=即可。如:

          Integer n1 = new Integer(47);
          Integer n2 = new Integer(47);
          System.out.println(ne.equals(n2));

          正如我們預計的那樣,此時得到的結果是true。但事實上并不總是這么簡單!假設您創建了自己的類,像下面這樣:
          class Value{
          int i;
          }
          public class Test{

                public static void main(String[] args){
                       Value v1 = new Value();
                      Value v2 = new Value();
                       System.out.println(v1.equals(v2));
              }
          }
          此時的結果又變回了false!

          這是由于equals()的默認行為是比較引用。所以除非在自己的新類中重載equals()方法,否則不可能表現出我們希望的行為。

          大多數Java類庫都實現了用來比較對象內容的equals()方法,而非比較對象引用的equals()方法。

          個人理解:equals()默認行為是比較引用,只是現在絕大多數Java類庫都實現了用來比較對象內容的equals()方法,而并沒有實現比較對象引用的equals()方法。所以現在說equals()比較的是內容,如果自己的類實現比較對象引用的equals()方法,也可以說equals()比較對象的引用,只是實現問題。

          Feedback

          # re: equals()方法個人理解  回復  更多評論   

          2009-08-09 10:19 by 戴爾筆記本
          不錯啊

          # re: equals()方法個人理解  回復  更多評論   

          2009-08-09 17:28 by 惜棋
          遠沒有那么簡單

          Integer n1 = new Integer(47);
          Integer n2 = new Integer(47);
          System.out.println(n1 ==n2);



          Integer m1 = new Integer(247);
          Integer m2 = new Integer(247);
          System.out.println(m1==m2);

          # re: equals()方法個人理解  回復  更多評論   

          2009-08-09 22:18 by charleeHu
          看看JDK源碼不就清楚了么 ==!

          # re: equals()方法個人理解  回復  更多評論   

          2009-08-10 15:13 by HalZhang
          不同的情況下還需要不同的比較方法,例如Hibernate的實體

          # re: equals()方法個人理解[未登錄]  回復  更多評論   

          2009-08-10 19:42 by stanleyxu2005
          It is clear that you should override the equals method for your own data type by default. BTW: Do not use "==" in general. If the object on the right side is null, an NullPointerException will be thrown.

          # re: equals()方法個人理解  回復  更多評論   

          2009-08-11 10:20 by 隔葉黃鶯
          樓主的理解恐怕把問題稍稍搞復雜了些,所謂比較內容只是 equals 方法的一個約定,如果高興的話你可以認為兩個對象只要某一個屬性(如id)是相等的就是 equals 的。

          所以說到底,你就看 equals() 方法的實現,看運行時具體調用了哪個 equals() 方法就行,就是面向對象的多態嗎!

          因為 Object 實現的 equals() 方法就是比較引用,所以如果你的類沒有實現 equals() 方法,它可能調用的就是 Object 的 equals() 方法來比較引用,除非繼承樹中有 equals() 的其他實現。

          像 String, Integer 等都自己實現了 equals() 方法,因此它們就比較了內容,說這么多看源碼吧。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 陈巴尔虎旗| 安宁市| 临潭县| 方山县| 霍邱县| 金沙县| 外汇| 青川县| 曲周县| 孝感市| 都江堰市| 济宁市| 云浮市| 积石山| 柏乡县| 合江县| 白朗县| 璧山县| 雅安市| 儋州市| 漳州市| 大丰市| 左权县| 青龙| 甘洛县| 平湖市| 东城区| 麻江县| 郯城县| 临漳县| 吴川市| 基隆市| 琼海市| 延边| 邹平县| 临桂县| 昔阳县| 嘉荫县| 大冶市| 革吉县| 陕西省|