txdyny

          常用鏈接

          統計

          最新評論

          (轉)java中equals方法與==邏輯運算符

          java中equals方法與==邏輯運算符

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

          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 ) );
           }
          }
           
          有沒有答案了,如果有了,看看你的答案正確嗎,
          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
           
          為什么會出現上面的結果呢,其實在Java中,邏輯運算符==號在比較對象的時候是嚴格的比較這兩個對象是不是同一個對象,說白了,它比較的是兩個對象在內存中的地址,只有當兩個變量指向同一個內存地址即同一個對象時才返回true,否則返回false,所以就可以看到當我們用new方法創建了o1和o2由于分配了兩個不同的內存空間,所以它們在用邏輯運算符==號來判斷兩個對象是否相等時自然應該返回的是false,而在比較o1和o3時,由于o3指向的實際是o1所指向的地址,所以返回true,在字符串中邏輯運算符==的作用和普通對象是一樣的。
           
          那么對于o1和o2用equals()方法比較返回的為什么也是false呢,我們來看一段代碼:
          public boolean equals( Object o2 )
          {
             this == o2;
          }
          這是Object中equals()函數的實現,可以看到實際上它的功能還是比較兩個對象的地址,自然你現在可以推出為什么o1和o2比較時還是返回false了。
           
          那現在問題可能來了,那為什么s1和s2比較時返回的是true呢,他們在內存空間的地址可是不一樣的啊,呵呵,其實這個理解起來更簡單了,因為在String類中重載了equals()函數,使它比較的是兩個字符串的內容,而不是兩個字符串對象在內存中的地址,至于如何寫這個函數我就不多說了,大家可以自己寫寫看,實現方式有多種,不過Sun公司當然只有那一種實現方式,哈哈

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


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


          網站導航:
           
          主站蜘蛛池模板: 阿拉善左旗| 宜良县| 穆棱市| 东丰县| 德惠市| 秦皇岛市| 阳东县| 黄龙县| 湘乡市| 县级市| 连州市| 通榆县| 武城县| 曲阜市| 彭水| 榕江县| 沽源县| 和田市| 天等县| 穆棱市| 伊川县| 唐海县| 获嘉县| 营山县| 绥德县| 体育| 新昌县| 贞丰县| 高陵县| 昌江| 承德县| 宁夏| 始兴县| 云阳县| 德阳市| 大余县| 阜南县| 镶黄旗| 华亭县| 昌宁县| 合肥市|