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

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

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

    小毅小議Java字符串

    Posted on 2008-08-25 12:22 H2O 閱讀(236) 評論(0)  編輯  收藏 所屬分類: java
    首先我們來看以個小例子:
    public class Test {
        
    public static void changeStr(String str) 
    {
            str 
    = "welcome"
    ;
        }


        
    public static void main(String[] args) {
            String str 
    = "1234"
    ;
            changeStr(str);
            System.out.println(str);
        }

    }
    輸出結果是什么?wecome?你錯了,是 1234  為什么呢?原因如下:

    <!--
        對象:一個對象可以被很多引用關聯 
    引用:一個引用只能關聯一個對象

    Ojbect xiaoyi1; Ojbect xiaoyi1; Ojbect xiaoyi1; 這里創建了三個引用 并沒有創建對象

    xiaoyi xy = new xiaoyi();

    xy是一個引用, new xiaoyi()這個在內存中創建了一個對象,這個對象被 xy這個引用所關聯
    引用就好比一個句柄對象,通過xy這個引用(句柄對象) 可以操作 new xiaoyi()對象
    引用也是一個值,只不過他的值記錄了其關聯對象的地址信息而已。
    public void test(String s1){ 
    只要是參數在方法內使用時,都會產生參數的副本的,記住這一點,無論java,C#,C,C++。 
    1>String temp = s1;
    這里s1只是一個引用的副本,是實際S1引用的一副本,好比你main方法內str實際引用的副本
    2>s1="welcome";
    在這里進行交換的時候你交換的僅僅是副本而已,雖然S1和main方法的str指向同一個對象,但是你交換的是main方法str引用的副本而已

    另外:String str="XIAOYI";
    str.toLowerCase() ;
    System.out.println(str);
    結果是什么?xiaoyi? 那么你又錯了。。
    因為在你調用toLowerCase()方法是會新開辟內存來保存轉換完成的對象,而你并沒有把原來對象的引用重新關聯被轉換后的對象,所以輸出的仍然是轉換前的對象 XIAOYI,要想改變結果怎么辦?
    重新關聯:str=str.toLowerCase();  這樣就可以了
    -->

    關于  Java字符串池(String pool)

    public   class   Sub{  
    String   str=new   String( "good ");   //一個地址的傳遞,new出來的對象,在內存中已經開辟了空間
     
    public   static   void   main(String   args[]){  
    Sub   ex=new   Sub();  
    ex.change(ex.str);  
    System.out.println(ex.str);  
    }  
    public   void   change(String   bb){  
    bb= "test   ok " }

    問題:String   str=new   String( "good ") 和String str="good"的區別?

    體會1:str是一個String類型的對象引用,他是Sub類的類變量。當ex對象引用使用change方法時。bb是str引用的拷貝。可以通過bb訪問原str的對象。而方法里當bb="test ok"的時候他把bb指向了一個新的對象中。這時候我們就要引出java字符串的概念了。

    體會2:字符串池(轉)String a = "Hello";
    String b = "Hello";
    String c = new String("Hello");
    String d = new String("Hello");
    System.out.println(a == b);
    System.out.println(b == c);
    System.out.println(c == d);
    System.out.println(a.equals(b));
    System.out.println(b.equals(c));
    System.out.println(c.equals(d));

    結果是true,false,false,true,true,true。這里就涉及到字符串池。“字符串池”,是Java為了提高內存利用率而采用的措施:

    當遇到String a = "Hello"; 這樣的語句時,Java會先在字符串池中尋找是否已經存在"Hello"這個字符串,如果沒有,則建立字符串"Hello"對象,然后變量 a 指向這個地址;然后遇到語句String b = "Hello",這時字符串池中已經有 "Hello"了,所以直接讓變量b也指向這個地址,省去了重新分配的麻煩。而在Java中,操作符“==”對于兩個基本型來說,是判斷其內容是否相同,對于兩個對象來說,則是判斷其地址是否相同,所以a == b返回 true。

    那么String c = new String("Hello")又如何處理呢?如果是這種寫法,則不會去訪問字符串池,而是先為變量 c 開辟空間,然后將值寫入空間。所以a == c返回false,c == d同樣返回false。

    至于String的equals方法,因為它比較的不是對象的地址,而是對象的值,所以都返回true就不奇怪了。

    Java虛擬機有一個字符串池,保存著幾乎所有的字符串對象。字符串表達式總是指向字符串池中的一個對象。使用new操作創建的字符串對象不指向字符串池中的對象但是可以使用intern方法使其指向字符串池中的對象.(注:如果池中已經有相同的字符串--使用equals方法確定,則直接返回池中的字符串,否則先將字符串添加到池中,再返回)。池中兩個相等的字符串如果使用“==”來比較將返回真。

    總結:也就是在change這個方法中,bb已經寫入str空間。而bb在等于“test ok”的時候是運用字符串池創建了對象中了。所以不能賦值。可以這樣 bb="test ok"; this.str=bb;

    理解有錯誤,希望看到的高手可以告訴我,以便我可以更好的修改,謝謝了。


    posts - 0, comments - 21, trackbacks - 0, articles - 101

    Copyright © H2O

    主站蜘蛛池模板: 成人性生免费视频| 国产AV无码专区亚洲AWWW | 亚洲熟妇av一区| 国产成人精品免费视频软件| 国产免费福利体检区久久| 78成人精品电影在线播放日韩精品电影一区亚洲 | 免费无码看av的网站| 久久久受www免费人成| 亚洲大尺码专区影院| yy6080久久亚洲精品| av在线亚洲欧洲日产一区二区| 日韩免费在线视频| 亚洲avav天堂av在线网毛片| 久久久久亚洲精品无码系列| 拔擦拔擦8x华人免费久久| 一区二区三区四区免费视频 | 777成影片免费观看| 国产精品亚洲精品日韩电影| 久久精品a亚洲国产v高清不卡| 亚洲M码 欧洲S码SSS222| 亚洲一级免费视频| 九九99热免费最新版| 亚洲老熟女五十路老熟女bbw| 亚洲国产精品无码专区在线观看| 午夜高清免费在线观看| 久久久久久国产精品免费免费男同| 亚洲AV无码一区二区大桥未久| 日韩亚洲AV无码一区二区不卡| 亚洲国产成人久久一区WWW| 国产情侣激情在线视频免费看| 成人免费777777被爆出| 在线观看亚洲免费视频| 亚洲an日韩专区在线| 久久精品国产精品亚洲艾| 亚洲国产黄在线观看| 香蕉视频在线观看免费国产婷婷| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | eeuss影院www天堂免费| 亚洲av综合av一区二区三区 | 亚洲s码欧洲m码吹潮| 亚洲三级在线观看|