String & StringBuffer的比較

JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據.這個String類提供了數值不可改變的字符串.而這個StringBuffer類提供的字符串進行修改.當你知道字符數據要改變的時候你就可以使用 StringBuffer.典型地,你可以使用 StringBuffers來動態構造字符數據.
    Java String的使用方法:
    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是可改變的
    Java StringBuffer的使用方法:
    1.java.lang.StringBuffer代表可變的字符序列;
    2.StringBuffer和String類似,但StringBuffer可以對其字符串進行改變;
    3.StringBuffer類的常見構造方法:
    StringBuffer()
    創建一個不包含字符序列的"空"的StringBuffer對象;
    StringBuffer(String str)
    創建一個StringBuffer對象,包含與String對象str相同的字符序列.
    4.常用方法:
    public StringBuffer append()
    可以爲該StringBuffer對象添加字符序列,返回添加後的該StringBuffer對象引用;
    public StringBuffer insert()
    可以爲該StringBuffer對象在指定位置插入字符序列,返回修改後的該
    public StringBuffer delete(int start,int end)
    可以刪除從start開始到end-1爲止的一段字符序列,返回修改後的該
    public StringBuffer reverse()
    用於將字符序列逆序,返回修改後的該StringBuffer對象引用.
    實例:
    程序代碼
    public class TestStringBuffer
    {
    public static void main(String args[]) {
    String s = "dengkehai" ;
    char[] a = {'a','b','c'} ;
    StringBuffer sb1 = new StringBuffer(s) ;
    sb1.append('/').append("DKH").append('/').append("J2SE") ;
    System.out.println(sb1) ;
    StringBuffer sb2 = new StringBuffer("Number:") ;
    for(int i=0 ;i<10 ;i++)
    sb2.append(i) ;
    System.out.println(sb2) ;
    sb2.delete(10,sb2.length()).insert(0,a) ;
    System.out.println(sb2) ;
    System.out.println(sb2.reverse()) ;
    }
    }
覺得不錯的資料,轉載了~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章