<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 閱讀(239) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java
    首先我們來(lái)看以個(gè)小例子:
    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);
        }

    }
    輸出結(jié)果是什么?wecome?你錯(cuò)了,是 1234  為什么呢?原因如下:

    <!--
        對(duì)象:一個(gè)對(duì)象可以被很多引用關(guān)聯(lián) 
    引用:一個(gè)引用只能關(guān)聯(lián)一個(gè)對(duì)象

    Ojbect xiaoyi1; Ojbect xiaoyi1; Ojbect xiaoyi1; 這里創(chuàng)建了三個(gè)引用 并沒(méi)有創(chuàng)建對(duì)象

    xiaoyi xy = new xiaoyi();

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

    另外:String str="XIAOYI";
    str.toLowerCase() ;
    System.out.println(str);
    結(jié)果是什么?xiaoyi? 那么你又錯(cuò)了。。
    因?yàn)樵谀阏{(diào)用toLowerCase()方法是會(huì)新開(kāi)辟內(nèi)存來(lái)保存轉(zhuǎn)換完成的對(duì)象,而你并沒(méi)有把原來(lái)對(duì)象的引用重新關(guān)聯(lián)被轉(zhuǎn)換后的對(duì)象,所以輸出的仍然是轉(zhuǎn)換前的對(duì)象 XIAOYI,要想改變結(jié)果怎么辦?
    重新關(guān)聯(lián):str=str.toLowerCase();  這樣就可以了
    -->

    關(guān)于  Java字符串池(String pool)

    public   class   Sub{  
    String   str=new   String( "good ");   //一個(gè)地址的傳遞,new出來(lái)的對(duì)象,在內(nèi)存中已經(jīng)開(kāi)辟了空間
     
    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 " }

    問(wèn)題:String   str=new   String( "good ") 和String str="good"的區(qū)別?

    體會(huì)1:str是一個(gè)String類(lèi)型的對(duì)象引用,他是Sub類(lèi)的類(lèi)變量。當(dāng)ex對(duì)象引用使用change方法時(shí)。bb是str引用的拷貝??梢酝ㄟ^(guò)bb訪問(wèn)原str的對(duì)象。而方法里當(dāng)bb="test ok"的時(shí)候他把bb指向了一個(gè)新的對(duì)象中。這時(shí)候我們就要引出java字符串的概念了。

    體會(huì)2:字符串池(轉(zhuǎn))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));

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

    當(dāng)遇到String a = "Hello"; 這樣的語(yǔ)句時(shí),Java會(huì)先在字符串池中尋找是否已經(jīng)存在"Hello"這個(gè)字符串,如果沒(méi)有,則建立字符串"Hello"對(duì)象,然后變量 a 指向這個(gè)地址;然后遇到語(yǔ)句String b = "Hello",這時(shí)字符串池中已經(jīng)有 "Hello"了,所以直接讓變量b也指向這個(gè)地址,省去了重新分配的麻煩。而在Java中,操作符“==”對(duì)于兩個(gè)基本型來(lái)說(shuō),是判斷其內(nèi)容是否相同,對(duì)于兩個(gè)對(duì)象來(lái)說(shuō),則是判斷其地址是否相同,所以a == b返回 true。

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

    至于String的equals方法,因?yàn)樗容^的不是對(duì)象的地址,而是對(duì)象的值,所以都返回true就不奇怪了。

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

    總結(jié):也就是在change這個(gè)方法中,bb已經(jīng)寫(xiě)入str空間。而bb在等于“test ok”的時(shí)候是運(yùn)用字符串池創(chuàng)建了對(duì)象中了。所以不能賦值??梢赃@樣 bb="test ok"; this.str=bb;

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


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

    Copyright © H2O

    主站蜘蛛池模板: 久久久久亚洲精品日久生情| 中文日韩亚洲欧美制服| 国产精品1024永久免费视频 | 亚洲午夜一区二区三区| 日本高清免费网站| 97超高清在线观看免费视频| 99亚洲精品高清一二区| 青青草国产免费久久久下载| 在线播放国产不卡免费视频| 中文字幕亚洲精品资源网| 最好免费观看韩国+日本| 中文字幕免费在线看电影大全| 亚洲国产美女视频| 亚洲精品99久久久久中文字幕| 日韩人妻无码精品久久免费一| 亚洲精品国产综合久久久久紧| 亚洲精品~无码抽插| 韩国18福利视频免费观看| 免费毛片a线观看| 亚洲a∨无码一区二区| 亚洲电影中文字幕| 国产乱子伦精品免费无码专区 | 美女巨胸喷奶水视频www免费| 激情内射亚洲一区二区三区爱妻 | 亚洲欧美精品午睡沙发| 亚洲国产a∨无码中文777| 国产精品冒白浆免费视频| 全部免费毛片在线播放| 一级女人18片毛片免费视频| 亚洲综合av一区二区三区不卡 | 亚洲嫩草影院久久精品| xvideos亚洲永久网址| 久久天天躁狠狠躁夜夜免费观看| 成人网站免费大全日韩国产| 久久精品国产亚洲AV| 亚洲国产高清视频在线观看| 亚洲AV永久无码精品| 亚洲一区二区三区国产精华液| 亚洲精品久久久www| 大学生a级毛片免费观看| 最近2019免费中文字幕视频三|