隨筆 - 20  文章 - 57  trackbacks - 0
          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          51CTO

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜


          完全用例子告訴你!不過首先你要清楚問題問的是什么?

          首先,因該明白String是引用類型,是一個類,是一個不可變的類,并且有著特殊的作用。
          String 只能復制一次!復制后不可改變!

          String s = new String(“abc”);
          s = new String(“cba”);
           
          以上的代碼并不是對s進行賦值,而是將“abc”的引用地址,從新賦給了s;
          這個過程的內存是怎么分配的呢?



          有幾個問題要給大家說明一下:


          1.String s = new String("abc");//在運行時涉及幾個String實例?
            
              答案:兩個,一個是字符串字面量"xyz"所對應的、駐留(intern)在一個全局共享的字符串常量池中的實例,另一個是通過new String(String)創建并初始化的、內容與"xyz"相同的實例。


          2.String s = new String("abc");//涉及用戶聲明的幾個String類型的變?

              答案:一個,就一個String s 。


          3.String s = null;
            
              Java里變量就是變量,引用類型的變量只是對某個對象實例或者null的引用,不是實例本身。聲明變量的個數跟創建實例的個數沒有必然關系。


          4.String s = new String("abc");//創建了幾個String Object?

              答案:兩個,一個是“abc”——這是一個匿名對象;一個是指向“abc”的引用對象s——這個是將匿名對象的地址賦給了s。


          下面我們來看一段代碼:

          public class text{
             
             public static void main(String[] args){
                //定義一個str
                String str = new String("abc");
                //定義一個str1
                String str1 = "abc";
                //定義一個str2
                String str2 = "abc";
               
                System.out.println(str1 == str);
                System.out.println(str2 == str1);


          }
           
          }

          運行結果是什么呢?




          為什么第一個運行結果是false呢?  在這里"==" 其實比較的是他們在堆內存中的地址,因為str 和 str1 在堆內存中的地址不同的所以運行結果是false;
          為什么第二個運行結果是true呢?   在這要說明一下,Sting是一個共享式輸出類型,在內存中有一個String pool 用于存放String類型中相同的值。所以在給str2賦值的時候,JVM會在String pool中查找是否有與其所賦的值相等,如果相等就將相等的值的地址賦給str2,如果沒有則在String pool中新開辟一塊控件存放str2的內容。


          這是我現在對String的一些理解,如果有錯誤,希望大家指出來,在這里謝謝大家了!
























          posted on 2010-10-16 23:51 tovep 閱讀(377) 評論(4)  編輯  收藏

          FeedBack:
          # re: Java_String小結 2010-10-17 12:42 迷人笑笑
          這是用什么工具畫的圖啊!?外觀不錯-呵呵---  回復  更多評論
            
          # re: Java_String小結 2010-10-17 18:57 Tovep
          @迷人笑笑
          用的是QQ的截圖做的! 呵呵!  回復  更多評論
            
          # re: Java_String小結 2010-11-10 20:01 小六夜瘋狂
          字符串常量池?
          “==”和equals  回復  更多評論
            
          # re: Java_String小結 2010-11-10 21:14 Tovep
          @小六夜瘋狂
          你可以這么理解:

          "=="比較的是棧內存中的內容,僅僅是內容!!!

          "equals"比較的是對內存中內容,而不是棧內存中內容,比如你想返回TRUE:棧內存中的內容可以不同(也就是他們指向堆內存中地址不同),但是他們在堆內存中的內容必須相同!!!  回復  更多評論
            

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


          網站導航:
           
          主頁 主站蜘蛛池模板: 梨树县| 天津市| 桂平市| 池州市| 拜泉县| 冀州市| 观塘区| 沐川县| 海晏县| 茶陵县| 武山县| 鱼台县| 南宁市| 英吉沙县| 巴林右旗| 乌兰察布市| 都昌县| 亳州市| 寿阳县| 灵石县| 布拖县| 原平市| 陇南市| 延边| 栾川县| 罗山县| 舒兰市| 昌宁县| 大冶市| 南和县| 镇远县| 陈巴尔虎旗| 若羌县| 阜阳市| 昆明市| 前郭尔| 沁水县| 闽清县| 桂东县| 满城县| 巴楚县|