<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一顆開花的樹

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

     

    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 澤來-王者之劍 閱讀(822) 評論(1)  編輯  收藏 所屬分類: j2se

    導航

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    主站蜘蛛池模板: 本免费AV无码专区一区| 国产午夜亚洲精品不卡免下载| 99re这里有免费视频精品| 久久久久亚洲精品男人的天堂 | 亚洲国产精品人人做人人爽 | 欧洲人成在线免费| 亚洲欧洲美洲无码精品VA| 99免费精品视频| 久久噜噜噜久久亚洲va久| 日本免费中文视频| 亚洲美女一区二区三区| 我们的2018在线观看免费高清| 亚洲中文字幕无码专区| 亚洲国产午夜精品理论片在线播放| 日批视频网址免费观看| 亚洲gv猛男gv无码男同短文| 无码一区二区三区亚洲人妻| 免费观看亚洲人成网站| 亚洲va乱码一区二区三区| 成全视频在线观看免费| 久久精品亚洲一区二区三区浴池 | 成人片黄网站色大片免费观看cn| 亚洲老妈激情一区二区三区| 曰批全过程免费视频观看免费软件 | 成人免费毛片视频| 亚洲成人黄色在线| 免费黄网在线观看| 一级一片免费视频播放| 亚洲人成影院在线| 成人午夜视频免费| 国产精品青草视频免费播放| 久久精品亚洲综合专区| 蜜桃视频在线观看免费网址入口| 91亚洲国产成人久久精品| 在线观看免费视频资源| 亚洲黄色在线观看网站| 老司机永久免费网站在线观看| A国产一区二区免费入口| 亚洲成a人片在线观看日本| 国产桃色在线成免费视频| 九九免费久久这里有精品23|