一顆開(kāi)花的樹(shù)

          談笑但看風(fēng)云起,龍騰尚待驚蟄春.

           

          java字符串知多少

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

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

              
          //傳入類(lèi)的對(duì)象
              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());
                      
          //這里打印結(jié)果為T(mén)est,但傳進(jìn)來(lái)的StringBuffer對(duì)象不會(huì)改變,出方法后仍為原來(lái)的值
              }

              
          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());            
                  
          //打出的結(jié)果為 sb1 add sb2 ,此處賦值方式為將sb1所指向的地址簡(jiǎn)單的賦值給sb2
                  
          //兩個(gè)對(duì)象指向同一內(nèi)存地址中的值.
              }

              
              
          private void strTest()
              
          {        
                  String str1 
          = "helloworld";
                  String str2 
          = "helloworld";        
                  
                  String str3 
          = new String("helloworld");
                  String str4 
          = new String("helloworld");    
                  
                  System.out.println(
          "字符串的存儲(chǔ)方式!");
                  System.out.println(str1 
          == str2);
                  System.out.println(str1 
          == str3);    
                  System.out.println(str4 
          == str3);    
                  
          //結(jié)果為true ,false ,false。每次new一個(gè)都會(huì)使用不同的內(nèi)存塊。
                  
          // 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(
          "-----------傳入字符串時(shí)---------------");
                      st.ChangeOne(st.str);
                      System.out.println(st.str);
                      
                      System.out.println(
          "-----------傳入類(lèi)對(duì)象時(shí),更改對(duì)象.str時(shí)---------------");
                      st.ChangeTwo(st);
                      System.out.println(st.str);
                      
                      System.out.println(
          "-----------將類(lèi)對(duì)象賦為null時(shí)---------------");
                      st.ChangeThree(st);
                      System.out.println(st.str);
                      
                      System.out.println(
          "--------------------------------------");
                      st.ChangeFour(st.str);            
                      System.out.println(st.str);
                      
                      System.out.println(
          "------------StringBuffer測(cè)試---------");
                      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測(cè)試2---------");
                      st.ChangeSeven();
                      st.strTest();
              }
              
          }

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

          2. 每次函數(shù)調(diào)用,運(yùn)行棧頂部上都會(huì)為 該函數(shù)調(diào)用 分配一個(gè)Stack Frame. 這也稱為Context. 

          3. 函數(shù)調(diào)用結(jié)束,棧指針回到上一級(jí)函數(shù)調(diào)用的Context, Stack Frame, 剛才分配的頂部Stack Frame 就失效。上一級(jí)函數(shù)成為當(dāng)前Stack Frame, Context。 

          4. 每次函數(shù)調(diào)用, 參數(shù)都會(huì) 壓棧 壓入運(yùn)行棧。注意,這是非常重要的。 

          5. 壓入運(yùn)行棧內(nèi)的 參數(shù),是 Copy 了一份。注意,這也是非常重要的。所以,對(duì)參數(shù) 賦值,對(duì)上一級(jí)函數(shù)調(diào)用來(lái)說(shuō),是根本沒(méi)有意義的。 
          因?yàn)橹皇歉淖兞隧敳縎tack Frame里面 參數(shù)Copy的內(nèi)容,根本不對(duì)上一級(jí) Stack Frame 造成任何影響。 

          */



          //關(guān)于String str = new String("abc"); String str2 = new String("abc"); 為什么會(huì)指向
          //不同的reference,有一種說(shuō)是利于lock的說(shuō)法
          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
                          }

                  }

          }

          //上面這情況每個(gè)strLock都有不同的reference,具有不同的同步鎖,不會(huì)相互影響。
          //如果是
          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
                          }

                  }

          }

          //這種情況下 兩個(gè)類(lèi)的lock都是相同的引用,兩個(gè)類(lèi)本身同步。
          //疑問(wèn):字符串池是針對(duì)同一個(gè)應(yīng)用程序中所有類(lèi)的不是不同的類(lèi)有不同的字符串池呢?
          //如果是不同的類(lèi)不同的字符串池,則上面的線程則仍是不相互干擾的。


          posted on 2006-03-14 00:32 澤來(lái)-王者之劍 閱讀(825) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): j2se

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類(lèi)

          隨筆檔案

          友情鏈接

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 甘泉县| 乌拉特前旗| 东宁县| 博野县| 科技| 绿春县| 桃源县| 迁安市| 阜南县| 察雅县| 尚义县| 吉安县| 花垣县| 绥宁县| 普定县| 循化| 湘潭市| 鹤庆县| 丰都县| 辉县市| 泸州市| 北安市| 乾安县| 含山县| 沽源县| 新宁县| 葫芦岛市| 布尔津县| 科技| 霸州市| 双流县| 玉树县| 潍坊市| 炉霍县| 兴化市| 雷州市| 黄平县| 托克逊县| 上饶市| 长岛县| 沈丘县|