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

          導航

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案(42)

          文章檔案(37)

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 45271
          • 排名 - 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: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 新田县| 宁化县| 南丹县| 融水| 淄博市| 河源市| 随州市| 瑞金市| 齐齐哈尔市| 孟连| 灵山县| 贺州市| 沂水县| 邢台市| 临夏市| 新化县| 乐安县| 三都| 宣恩县| 航空| 常山县| 杭锦后旗| 陇南市| 舞钢市| 阿合奇县| 明溪县| 天峨县| 延长县| 榆树市| 威海市| 荥经县| 长顺县| 手机| 彩票| 清河县| 平利县| 高州市| 长岛县| 阿巴嘎旗| 榆中县| 衡山县|