一顆開花的樹

          談笑但看風云起,龍騰尚待驚蟄春.

           

          java字符串知多少

          public class stringTest
          {
              String str 
          = "1234";
              
          private void ChangeOne(String s)
              
          {
                  s 
          = "4321";    
              }

              
          private void ChangeTwo(stringTest st)
              
          {
                  st.str 
          = "5678";
              }

              
          //傳入類的對象
              private void ChangeThree(stringTest st)
              
          {
                  st 
          = null;    
              }

              
              
          private void ChangeFour(String str)
              
          {
                      String str2 
          = str;
                      str 
          = "hello";
                      System.out.println(
          "str is " + str);
                      System.out.println(
          "str2 is "+ str2);
              }

              
              
          private void ChangeFive(StringBuffer sb)
              
          {
                      sb 
          = new StringBuffer("Test");
                      System.out.println(sb.toString());
                      
          //這里打印結果為Test,但傳進來的StringBuffer對象不會改變,出方法后仍為原來的值
              }

              
          private void ChangeSix(StringBuffer sb)
              
          {
                  sb.append(
          "world ");    
              }

              
              
          private void ChangeSeven()
              
          {
                  StringBuffer sb1 
          = new StringBuffer("sb1 ");
                  StringBuffer sb2 
          = new StringBuffer();
                  sb2 
          = sb1;
                  sb2.append(
          "add sb2");
                  System.out.println(sb1.toString());            
                  
          //打出的結果為 sb1 add sb2 ,此處賦值方式為將sb1所指向的地址簡單的賦值給sb2
                  
          //兩個對象指向同一內存地址中的值.
              }

              
              
          private void strTest()
              
          {        
                  String str1 
          = "helloworld";
                  String str2 
          = "helloworld";        
                  
                  String str3 
          = new String("helloworld");
                  String str4 
          = new String("helloworld");    
                  
                  System.out.println(
          "字符串的存儲方式!");
                  System.out.println(str1 
          == str2);
                  System.out.println(str1 
          == str3);    
                  System.out.println(str4 
          == str3);    
                  
          //結果為true ,false ,false。每次new一個都會使用不同的內存塊。
                  
          // str1和str2指向字符串常量 str,而str3,str4指向各自的 new String("str");
                  
                  String str5 
          = "hello"+"world";
                  String str6 
          = "hello";
                  String str7 
          = "world";
                  String str8 
          = str6 + str7;
                  
                  System.out.println(
          "str1 == str5 is: "+(str1 == str5));
                  System.out.println(
          "str1 == str8 is: "+(str1 == str8));
              }

              
          public static void main(String[] args)
              
          {            
                      stringTest st 
          = new stringTest();
                      System.out.println(st.str);
                      System.out.println(
          "-----------傳入字符串時---------------");
                      st.ChangeOne(st.str);
                      System.out.println(st.str);
                      
                      System.out.println(
          "-----------傳入類對象時,更改對象.str時---------------");
                      st.ChangeTwo(st);
                      System.out.println(st.str);
                      
                      System.out.println(
          "-----------將類對象賦為null時---------------");
                      st.ChangeThree(st);
                      System.out.println(st.str);
                      
                      System.out.println(
          "--------------------------------------");
                      st.ChangeFour(st.str);            
                      System.out.println(st.str);
                      
                      System.out.println(
          "------------StringBuffer測試---------");
                      StringBuffer sb 
          = new StringBuffer("Hello ");
                      st.ChangeFive(sb);
                      System.out.println(sb.toString());
                      st.ChangeSix(sb);
                      System.out.println(sb.toString());
                      
                      System.out.println(
          "------------StringBuffer測試2---------");
                      st.ChangeSeven();
                      st.strTest();
              }
              
          }

          /*
          //(1) 當 = 的右邊全是字符串常量,那么 = 左邊的變量(左值)也成為字符串常量。 
          //(2) 當 = 的右邊包含字符串變量(或其它變量),那么 = 左邊的變量(左值)也成為字符串變量(StringBuffer().append()的結果)。 
          1. 每個Thread有自己的 運行棧。Stack 

          2. 每次函數調用,運行棧頂部上都會為 該函數調用 分配一個Stack Frame. 這也稱為Context. 

          3. 函數調用結束,棧指針回到上一級函數調用的Context, Stack Frame, 剛才分配的頂部Stack Frame 就失效。上一級函數成為當前Stack Frame, Context。 

          4. 每次函數調用, 參數都會 壓棧 壓入運行棧。注意,這是非常重要的。 

          5. 壓入運行棧內的 參數,是 Copy 了一份。注意,這也是非常重要的。所以,對參數 賦值,對上一級函數調用來說,是根本沒有意義的。 
          因為只是改變了頂部Stack Frame里面 參數Copy的內容,根本不對上一級 Stack Frame 造成任何影響。 

          */



          //關于String str = new String("abc"); String str2 = new String("abc"); 為什么會指向
          //不同的reference,有一種說是利于lock的說法
          class ClassLockA1
          {
                  String strLock 
          = new String("lock");
                  
          private void startA1()
                  
          {
                          
          synchronized(strLock)
                          
          {
                                  
          //do something here
                          }

                  }
                  
          }

          class ClassLockA2
          {
                  String strLock 
          = new String("lock");    
                  
          private void startA2()
                  
          {
                          
          synchronized(strLock)
                          
          {
                                  
          //do something here
                          }

                  }

          }

          //上面這情況每個strLock都有不同的reference,具有不同的同步鎖,不會相互影響。
          //如果是
          class ClassLockB1
          {
                  String strLock 
          = "lock";
                  
          private void startA1()
                  
          {
                          
          synchronized(strLock)
                          
          {
                                  
          //do something here
                          }

                  }
                  
          }

          class ClassLockB2
          {
                  String strLock 
          = "lock";
                  
          private void startA2()
                  
          {
                          
          synchronized(strLock)
                          
          {
                                  
          //do something here
                          }

                  }

          }

          //這種情況下 兩個類的lock都是相同的引用,兩個類本身同步。
          //疑問:字符串池是針對同一個應用程序中所有類的不是不同的類有不同的字符串池呢?
          //如果是不同的類不同的字符串池,則上面的線程則仍是不相互干擾的。


          posted on 2006-03-14 00:32 澤來-王者之劍 閱讀(824) 評論(1)  編輯  收藏 所屬分類: j2se

          導航

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 卢氏县| 靖边县| 上蔡县| 开封县| 略阳县| 三门县| 丰都县| 那坡县| 长泰县| 通化县| 双柏县| 池州市| 南溪县| 建宁县| 凤山市| 水城县| 阜城县| 东安县| 西贡区| 上蔡县| 波密县| 都安| 丽水市| 云阳县| 湟源县| 四平市| 北海市| 安康市| 朝阳区| 乌兰察布市| 赣榆县| 上饶市| 宁南县| 华蓥市| 双峰县| 双城市| 行唐县| 扶风县| 永泰县| 逊克县| 玛沁县|