期待更好更穩定的開源FrameWork的出現,讓我們一起努力吧!  
          日歷
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910
          統計
          • 隨筆 - 78
          • 文章 - 1
          • 評論 - 29
          • 引用 - 0

          導航

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案(42)

          文章檔案(37)

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 45265
          • 排名 - 1064

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

           

          我有很多概念都沒明白,現在反過頭來認識。

          Object是所有類的父類。
          java.lang.String也是繼承自java.lang.Object中。

          先比較一下2個類的toString()、equals()、= = (很多面試題都有),再來說一下String 的特殊。

          2個類toString()的比較:

          class Test {
              
          public static void
           main(String [] args) {
                  Object obj 
          = new
           Object();
                  Dog d 
          = new
           Dog();
                  String s 
          = new String("abc"
          );
                  
                  System.out.println(
          "obj = " +
           obj);    
                  System.out.println(
          "d = " +
           d);
                  System.out.println(
          "s = " +
           s);
              }
          }

          class
           Dog {}

          結果:

          obj 
          =
           java.lang.Object@c17164
          =
           Dog@1fb8ee3
          =
           abc


          查閱API文檔:

          Object類的 public String toString()   returns  
                              getClass().getName() 
          + '@' +
           Integer.toHexString(hashCode())
          String類的  
          public
           String toString()   returns  
                                the string itself.


          說明String類重寫了Object的toString方法。

          2個類equals()、= =比較:

          class Test {
              
          public static void
           main(String [] args) {
                  
                  
          //比較equals()和==

                  Dog d1 = new Dog(1);
                  Dog d2 
          = new Dog(1
          );
                  
                  System.out.println(
          "d1 == d2 " + (d1 == d2)); //false

                  System.out.println("d1.equals(d2) " + d1.equals(d2)); //false
                  
                  String s1 
          = new String("abc"
          );
                  String s2 
          = new String("abc"
          );
                  String s3 
          = "abc"
          ;
                  
                  System.out.println(
          "s1 == s2 " + (s1 == s2)); //false

                  System.out.println("s1.equals(s2) " + s1.equals(s2)); //ture
                  
                  System.out.println(
          "s1 == s3 " + (s1 == s3)); //false

                  System.out.println("s1.equals(s3) " + s1.equals(s3)); //true
              }
          }

          class
           Dog {
              
          private int
           i;
              Dog(){}
              Dog(
          int
           i){
                  
          this.i =
           i;
              }
          }

           

          "=="是比較2個對象的引用是否指向同一個地址,如果是比較2個基本類型,那么就是比較2個值是否相等。
          我new了2個Dog類,他們2個對象的棧引用肯定不能指向同一個堆地址。第二個String對象"=="的比較也是同樣道理。所以都返回了false(第三個比較體現了String的特殊類,等下說明)。

          查閱jdk的源代碼:"equals"在Object中定義為

          public boolean equals(Object obj) {
              
          return (this ==
           obj);
          }

          這就表示一個類如果沒有重寫該方法的話,它就是比較兩個的引用是否指向了同一個地址(和"=="比較是一致的)。
          類庫里的類基本都重寫的該方法,所以是比較2個對象的內容是否一樣的(String方法重寫了該方法,所以第二個equals比較返回ture),對于外面自己自定義的類,則需要自己重寫該方法來達到內容是否相等的邏輯。


          特殊對象String的equals()、= =比較

          String s = newString("abc");和String s = "abc";
          首先2個對象在內存分布上是不一樣的。第2個對象是s的棧引用指向數據片段區的地址(存放字符串常量,靜態成員變量)。第1個new出來的對象是s的棧引用指向堆中的地址(存放在堆中)。通過API文檔:新創建的字符串對象s是該參數字符串("abc")的副本。

          所以如代碼所表示:"=="比較是不一樣的,equals方法由于String重寫了,比較是字符序列。

           

          String s1 = "abc"    和  String s2 = "abc"比較;

          "=="和equals方法都返回ture;
          s1分配了字符常量"abc",那么再有"abc"要引用給對象,都不會再分配內存空間了。
          所以s1 和s2 指向的空間相同,內容也相同。



          posted on 2008-12-09 12:46 BlueSky_itwangxinli 閱讀(177) 評論(0)  編輯  收藏

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


          網站導航:
           
           
          Copyright © BlueSky_itwangxinli Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 景泰县| 华亭县| 资源县| 韩城市| 上高县| 安多县| 清徐县| 赞皇县| 衢州市| 临江市| 泽库县| 达孜县| 邵阳市| 永丰县| 健康| 揭阳市| 云和县| 房产| 治县。| 开原市| 美姑县| 邢台县| 远安县| 新竹市| 扬州市| 临湘市| 隆昌县| 冀州市| 德清县| 南丹县| 互助| 运城市| 梨树县| 乌拉特中旗| 台北县| 普格县| 荥阳市| 新密市| 上饶县| 枣阳市| 林甸县|