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

          導航

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案(42)

          文章檔案(37)

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 45529
          • 排名 - 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 閱讀(180) 評論(0)  編輯  收藏

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


          網站導航:
           
           
          Copyright © BlueSky_itwangxinli Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 资阳市| 灌阳县| 沂水县| 淳安县| 海盐县| 眉山市| 衢州市| 尤溪县| 攀枝花市| 正镶白旗| 许昌市| 榆中县| 南郑县| 金堂县| 都匀市| 耿马| 平定县| 西和县| 南郑县| 龙门县| 大丰市| 高淳县| 潞西市| 东乡县| 右玉县| 渝北区| 项城市| 文水县| 安康市| 新建县| 理塘县| 嘉义县| 湖口县| 贡山| 法库县| 石台县| 德格县| 罗甸县| 开远市| 会东县| 崇明县|