隨筆-10  評論-11  文章-20  trackbacks-0
          大家先來看看下面這段程序:
          public class Test{
              public static void main(String args[])
          {
              String str1 = "abc";
              String str = "abc;
              String str2 = new String("abc");

              System.out.println(str1 == str2);
              System.out.println(str1.equals(str2));
              System.out.println(str == str1);
          }
          }

          這段代碼的運行結果是:
          第一句println輸出的是false;而第二句則輸出為true;但是第三句卻是true。

          在這里很多人會誤認為第一句應該是true的,但是事實卻是false。這是因為第一句在進行“==”比較的時候比較的是兩個指向,而不是具體指向的內容。而第三句在進行“==”比較的時候同樣比較的是指向,但是他們的指向是相同的。這種現象出現的原因和字符串在內存中實例化的時候有關。
          具體情況如下圖所示:

          當執行第一句Str1 = "abc" 實例化出第一個指向;當進行第二句Str = "abc" 的時候出現第二個指向,因為堆內存中存在"abc",而且str也沒有new一個新的對象,所以為了節省內存,str指向了str1所指向的對象;但是第三句的時候出現new語句,他實例化出了一塊新的空間用來盛放"abc",自然str2的指向也也是指向這段新開辟的空間。
          posted on 2010-10-23 16:25 Soap MacTavish 閱讀(6111) 評論(4)  編輯  收藏

          評論:
          # re: String str1 = new String("abc")與 String str1 = "abc"的區別 2011-10-14 18:01 | jjavaboy
          str也沒有new一個新的對象,所以為了節省內存,str指向了str1所指向的對象;
          這名話解決我的問題,thanks.  回復  更多評論
            
          # re: String str1 = new String("abc")與 String str1 = "abc"的區別 2013-03-10 11:04 | 大的
          str1,str的內容“abc”不是在棧空間嗎?  回復  更多評論
            
          # re: String str1 = new String("abc")與 String str1 = "abc"的區別 2015-01-23 14:39 | 頂頂頂
          所以為了節省內存,str指向了str1所指向的對象, 后面對象兩個字應該改為內存吧


            回復  更多評論
            
          # re: String str1 = new String("abc")與 String str1 = "abc"的區別 2015-01-23 14:39 | 頂頂頂
          所以為了節省內存,str指向了str1所指向的對象 后面對象應該改為內存吧  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 西贡区| 长治县| 黄冈市| 镇原县| 曲松县| 罗源县| 北海市| 盐池县| 靖江市| 周至县| 灌阳县| 兴和县| 天等县| 丰台区| 卢龙县| 台前县| 洛扎县| 吐鲁番市| 平山县| 定结县| 丁青县| 瓮安县| 南部县| 溆浦县| 陆丰市| 青田县| 民和| 柳州市| 新平| 莲花县| 麟游县| 石家庄市| 石棉县| 荃湾区| 铁力市| 黄石市| 尖扎县| 漳平市| 沁阳市| 扶沟县| 永福县|