txdyny

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          (轉(zhuǎn))java中equals方法與==邏輯運(yùn)算符

          java中equals方法與==邏輯運(yùn)算符

              在Java中,我們比較兩個(gè)對(duì)象時(shí)有兩種方法,一種是直接使用邏輯運(yùn)算符==號(hào),還有一種就是用equlas()函數(shù),該函數(shù)在Object中就定義了,所以每個(gè)類(lèi)都會(huì)有這個(gè)函數(shù),好了現(xiàn)在我們看看普通對(duì)象和字符串在使用這兩種比較方式有什么不同,看下面代碼,讀者可以猜猜看結(jié)果是什么:

          public class Equals {
           /**
            * @param args
            */
           public static void main(String[] args) {
            Object o1 = new Object();
            Object o2 = new Object();
            Object o3 = o1;
            Object o4 = o2;
            System.out.println( "o1.equals( o1 ): " + o1.equals( o1 ) );
            System.out.println( "o1.equals( o2 ): " + o1.equals( o2 ) );
            System.out.println( "o1.equals( o3 ): " + o1.equals( o3 ) );
            System.out.println( "o1.equals( o4 )" + o1.equals( o4 ) );
           
            System.out.println();
            System.out.println( "o1 == o1: " + ( o1 == o1 ) );
            System.out.println( "o1 == o2: " + ( o1 == o2 ) );
            System.out.println( "o1 == o3: " + ( o1 == o3 ) );
            System.out.println( "o1 == o4: " + ( o1 == o4 ) );
            System.out.println();
            String s1 = new String( "abc" );
            String s2 = new String( "abc" );
            String s3 = new String( "def" );
            String s4 = s1;
            String s5 = s2;
            String s6 = s3;
            System.out.println( "s1.equals( s1 ): " + s1.equals( s1 ) );
            System.out.println( "s1.equals( s2 ): " + s1.equals( s2 ) );
            System.out.println( "s1.equals( s3 ): " + s1.equals( s3 ) );
            System.out.println( "s1.equals( s4 ): " + s1.equals( s4 ) );
            System.out.println( "s1.equals( s5 ): " + s1.equals( s5 ) );
            System.out.println( "s1.equals( s6 ): " + s1.equals( s6 ) );
            System.out.println();
            System.out.println( "s1 == s1: " + ( s1 == s1 ) );
            System.out.println( "s1 == s2: " + ( s1 == s2 ) );
            System.out.println( "s1 == s3: " + ( s1 == s3 ) );
            System.out.println( "s1 == s4: " + ( s1 == s4 ) );
            System.out.println( "s1 == s5: " + ( s1 == s5 ) );
            System.out.println( "s1 == s6: " + ( s1 == s6 ) );
           }
          }
           
          有沒(méi)有答案了,如果有了,看看你的答案正確嗎,
          o1.equals( o1 ): true
          o1.equals( o2 ): false
          o1.equals( o3 ): true
          o1.equals( o4 )false
          o1 == o1: true
          o1 == o2: false
          o1 == o3: true
          o1 == o4: false
          s1.equals( s1 ): true
          s1.equals( s2 ): true
          s1.equals( s3 ): false
          s1.equals( s4 ): true
          s1.equals( s5 ): true
          s1.equals( s6 ): false
          s1 == s1: true
          s1 == s2: false
          s1 == s3: false
          s1 == s4: true
          s1 == s5: false
          s1 == s6: false
           
          為什么會(huì)出現(xiàn)上面的結(jié)果呢,其實(shí)在Java中,邏輯運(yùn)算符==號(hào)在比較對(duì)象的時(shí)候是嚴(yán)格的比較這兩個(gè)對(duì)象是不是同一個(gè)對(duì)象,說(shuō)白了,它比較的是兩個(gè)對(duì)象在內(nèi)存中的地址,只有當(dāng)兩個(gè)變量指向同一個(gè)內(nèi)存地址即同一個(gè)對(duì)象時(shí)才返回true,否則返回false,所以就可以看到當(dāng)我們用new方法創(chuàng)建了o1和o2由于分配了兩個(gè)不同的內(nèi)存空間,所以它們?cè)谟眠壿嬤\(yùn)算符==號(hào)來(lái)判斷兩個(gè)對(duì)象是否相等時(shí)自然應(yīng)該返回的是false,而在比較o1和o3時(shí),由于o3指向的實(shí)際是o1所指向的地址,所以返回true,在字符串中邏輯運(yùn)算符==的作用和普通對(duì)象是一樣的。
           
          那么對(duì)于o1和o2用equals()方法比較返回的為什么也是false呢,我們來(lái)看一段代碼:
          public boolean equals( Object o2 )
          {
             this == o2;
          }
          這是Object中equals()函數(shù)的實(shí)現(xiàn),可以看到實(shí)際上它的功能還是比較兩個(gè)對(duì)象的地址,自然你現(xiàn)在可以推出為什么o1和o2比較時(shí)還是返回false了。
           
          那現(xiàn)在問(wèn)題可能來(lái)了,那為什么s1和s2比較時(shí)返回的是true呢,他們?cè)趦?nèi)存空間的地址可是不一樣的啊,呵呵,其實(shí)這個(gè)理解起來(lái)更簡(jiǎn)單了,因?yàn)樵赟tring類(lèi)中重載了equals()函數(shù),使它比較的是兩個(gè)字符串的內(nèi)容,而不是兩個(gè)字符串對(duì)象在內(nèi)存中的地址,至于如何寫(xiě)這個(gè)函數(shù)我就不多說(shuō)了,大家可以自己寫(xiě)寫(xiě)看,實(shí)現(xiàn)方式有多種,不過(guò)Sun公司當(dāng)然只有那一種實(shí)現(xiàn)方式,哈哈

          posted on 2007-12-09 18:10 趙大頤 閱讀(503) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 聂拉木县| 新蔡县| 南京市| 高唐县| 涿州市| 安陆市| 盐亭县| 遵义市| 华亭县| 安宁市| 白玉县| 兴业县| 广德县| 东阿县| 阿巴嘎旗| 特克斯县| 嘉黎县| 松阳县| 长治县| 通山县| 临夏市| 鄱阳县| 石阡县| 陕西省| 突泉县| 宿迁市| 荥阳市| 西充县| 惠水县| 隆德县| 六盘水市| 古浪县| 伽师县| 威信县| 肇庆市| 遵义县| 望城县| 泽州县| 比如县| 绍兴县| 宁河县|