equals()方法個(gè)人理解

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

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

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

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

          正如我們預(yù)計(jì)的那樣,此時(shí)得到的結(jié)果是true。但事實(shí)上并不總是這么簡(jiǎn)單!假設(shè)您創(chuàng)建了自己的類,像下面這樣:
          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));
              }
          }
          此時(shí)的結(jié)果又變回了false!

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

          大多數(shù)Java類庫(kù)都實(shí)現(xiàn)了用來(lái)比較對(duì)象內(nèi)容的equals()方法,而非比較對(duì)象引用的equals()方法。

          個(gè)人理解:equals()默認(rèn)行為是比較引用,只是現(xiàn)在絕大多數(shù)Java類庫(kù)都實(shí)現(xiàn)了用來(lái)比較對(duì)象內(nèi)容的equals()方法,而并沒(méi)有實(shí)現(xiàn)比較對(duì)象引用的equals()方法。所以現(xiàn)在說(shuō)equals()比較的是內(nèi)容,如果自己的類實(shí)現(xiàn)比較對(duì)象引用的equals()方法,也可以說(shuō)equals()比較對(duì)象的引用,只是實(shí)現(xiàn)問(wèn)題。

          Feedback

          # re: equals()方法個(gè)人理解  回復(fù)  更多評(píng)論   

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

          # re: equals()方法個(gè)人理解  回復(fù)  更多評(píng)論   

          2009-08-09 17:28 by 惜棋
          遠(yuǎn)沒(méi)有那么簡(jiǎn)單

          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()方法個(gè)人理解  回復(fù)  更多評(píng)論   

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

          # re: equals()方法個(gè)人理解  回復(fù)  更多評(píng)論   

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

          # re: equals()方法個(gè)人理解[未登錄](méi)  回復(fù)  更多評(píng)論   

          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()方法個(gè)人理解  回復(fù)  更多評(píng)論   

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

          所以說(shuō)到底,你就看 equals() 方法的實(shí)現(xiàn),看運(yùn)行時(shí)具體調(diào)用了哪個(gè) equals() 方法就行,就是面向?qū)ο蟮亩鄳B(tài)嗎!

          因?yàn)?Object 實(shí)現(xiàn)的 equals() 方法就是比較引用,所以如果你的類沒(méi)有實(shí)現(xiàn) equals() 方法,它可能調(diào)用的就是 Object 的 equals() 方法來(lái)比較引用,除非繼承樹(shù)中有 equals() 的其他實(shí)現(xiàn)。

          像 String, Integer 等都自己實(shí)現(xiàn)了 equals() 方法,因此它們就比較了內(nèi)容,說(shuō)這么多看源碼吧。

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 四平市| 布拖县| 呼和浩特市| 上虞市| 盘锦市| 文水县| 九龙城区| 渑池县| 黑山县| 获嘉县| 惠东县| 开封县| 益阳市| 自贡市| 高要市| 钦州市| 大关县| 永顺县| 开封市| 宁明县| 建昌县| 靖边县| 清远市| 苍南县| 西青区| 商城县| 务川| 蒲城县| 安达市| 营山县| 霞浦县| 旬邑县| 侯马市| 岳西县| 嘉兴市| 祁阳县| 岚皋县| 同心县| 富阳市| 鄱阳县| 巢湖市|