javaGrowing

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks
          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(12)

          隨筆分類(84)

          隨筆檔案(92)

          文章分類(32)

          文章檔案(33)

          相冊

          收藏夾(1)

          ajax

          java

          java專家論壇

          linux

          Oracle

          PHP

          sap

          xml

          其他

          好站鏈接

          英語學習

          軟件下載

          電子書

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          1. 首先String不屬于8種基本數據類型,String是一個對象。

            因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。

            2. new String()和new String(“”)都是申明一個新的空字符串,是空串不是null;

            3. String str=”kvill”;String str=new String (“kvill”);的區別:

            在這里,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。

            常量池(constant pool)指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數據。它包括了關于類、方法、接口等中的常量,也包括字符串常量。

            看例1:

          String s0=”kvill”;
          String s1=”kvill”;
          String s2=”kv” + “ill”;
          System.out.println( s0==s1 );
          System.out.println( s0==s2 );

            結果為:

          true
          true

            首先,我們要知道Java會確保一個字符串常量只有一個拷貝。

            因為例子中的s0和s1中的”kvill”都是字符串常量,它們在編譯期就被確定了,所以s0==s1為true;而”kv”和”ill”也都是字符串常量,當一個字符串由多個字符串常量連接而成時,它自己肯定也是字符串常量,所以s2也同樣在編譯期就被解析為一個字符串常量,所以s2也是常量池中” kvill”的一個引用。

            所以我們得出s0==s1==s2;

            用new String() 創建的字符串不是常量,不能在編譯期就確定,所以new String() 創建的字符串不放入常量池中,它們有自己的地址空間。

            看例2:

          String s0=”kvill”;
          String s1=new String(”kvill”);
          String s2=”kv” + new String(“ill”);
          System.out.println( s0==s1 );
          System.out.println( s0==s2 );
          System.out.println( s1==s2 );

            結果為:

          false
          false
          false

            例2中s0還是常量池中”kvill”的應用,s1因為無法在編譯期確定,所以是運行時創建的新對象”kvill”的引用,s2因為有后半部分new String(“ill”)所以也無法在編譯期確定,所以也是一個新創建對象”kvill”的應用;明白了這些也就知道為何得出此結果了。

            4. String.intern():

            再補充介紹一點:存在于.class文件中的常量池,在運行期被JVM裝載,并且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等于str的字符串并返回它的引用;看例3就清楚了

            例3:

          String s0= “kvill”;
          String s1=new String(”kvill”);
          String s2=new String(“kvill”);
          System.out.println( s0==s1 );
          System.out.println( “**********” );
          s1.intern();
          s2=s2.intern(); //把常量池中“kvill”的引用賦給s2
          System.out.println( s0==s1);
          System.out.println( s0==s1.intern() );
          System.out.println( s0==s2 );

            結果為:

          false
          **********
          false //雖然執行了s1.intern(),但它的返回值沒有賦給s1
          true //說明s1.intern()返回的是常量池中”kvill”的引用
          true

            最后我再破除一個錯誤的理解:

            有人說,“使用String.intern()方法則可以將一個String類的保存到一個全局String表中,如果具有相同值的Unicode字符串已經在這個表中,那么該方法返回表中已有字符串的地址,如果在表中沒有相同值的字符串,則將自己的地址注冊到表中“如果我把他說的這個全局的 String表理解為常量池的話,他的最后一句話,“如果在表中沒有相同值的字符串,則將自己的地址注冊到表中”是錯的:

            看例4:

          String s1=new String("kvill");
          String s2=s1.intern();
          System.out.println( s1==s1.intern() );
          System.out.println( s1+" "+s2 );
          System.out.println( s2==s1.intern() );

            結果:

          false
          kvill kvill
          true

            在這個類中我們沒有聲名一個”kvill”常量,所以常量池中一開始是沒有”kvill”的,當我們調用s1.intern()后就在常量池中新添加了一個” kvill”常量,原來的不在常量池中的”kvill”仍然存在,也就不是“將自己的地址注冊到常量池中”了。

            s1==s1.intern()為false說明原來的“kvill”仍然存在;

            s2現在為常量池中“kvill”的地址,所以有s2==s1.intern()為true。

            5. 關于equals()和==:

            這個對于String簡單來說就是比較兩字符串的Unicode序列是否相當,如果相等返回true;而==是比較兩字符串的地址是否相同,也就是是否是同一個字符串的引用。

            6. 關于String是不可變的

            這一說又要說很多,大家只要知道String的實例一旦生成就不會再改變了,比如說:String str=”kv”+”ill”+” “+”ans”;就是有4個字符串常量,首先”kv”和”ill”生成了”kvill”存在內存中,然后”kvill”又和” “ 生成 ”kvill “存在內存中,最后又和生成了”kvill ans”;并把這個字符串的地址賦給了str,就是因為String的“不可變”產生了很多臨時變量,這也就是為什么建議用StringBuffer的原因了,因為StringBuffer是可改變的

          posted on 2006-03-03 09:03 javaGrowing 閱讀(356) 評論(0)  編輯  收藏 所屬分類: java 學習
          主站蜘蛛池模板: 靖西县| 新野县| 西城区| 平邑县| 宁陵县| 三门峡市| 师宗县| 淮安市| 天台县| 阿坝县| 泸州市| 石河子市| 岳阳县| 安宁市| 温泉县| 高碑店市| 灯塔市| 临漳县| 杭锦旗| 绍兴县| 大化| 贡嘎县| 永修县| 承德市| 霍州市| 香格里拉县| 安阳市| 正定县| 全州县| 东山县| 腾冲县| 章丘市| 沧州市| 宁都县| 加查县| 新乡市| 新兴县| 罗江县| 什邡市| 馆陶县| 南和县|