equals()方法個人理解

          Posted on 2009-08-08 12:38 BBT_soft 閱讀(2052) 評論(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() 方法,因此它們就比較了內容,說這么多看源碼吧。

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


          網站導航:
           
          主站蜘蛛池模板: 玉田县| 嫩江县| 兰溪市| 营口市| 泰州市| 邵阳县| 兴隆县| 确山县| 略阳县| 峨山| 望都县| 金门县| 宁化县| 彭泽县| 临沂市| 南靖县| 衢州市| 交口县| 阳原县| 岳池县| 金沙县| 治县。| 阿拉善左旗| 双鸭山市| 襄汾县| 米泉市| 洪江市| 藁城市| 涪陵区| 定襄县| 衡阳县| 张北县| 赣州市| 综艺| 封丘县| 昭觉县| 汽车| 梅河口市| 弋阳县| 湘阴县| 筠连县|