天天看點

String和StringBuffer差別

android Java String 與 StringBuffer 用法差別

String類用來表示那些建立後就不會再改變的字元串,它是immutable的。而StringBuffer類用來表示内容可變的字元串,并提供了修改底層字元串的方法。

--當我們進行字元拼接時,請使用StringBuffer類而非String類,因為前者将比後者快上百倍。

在程式的太多場合我們都會進行字元串拼接工作,簡單的代碼示例如下:

String str="You are nice.";

str+="I love you so much.";

如果用StringBuffer類的話,代碼如下:

StringBuffer str= new StringBuffer("You are nice.");

str.append("I love you so much.");

從表面看來String類隻用一個加号(+)便完成了字元串的拼接,而StringBuffer類卻要調用一個append()方法,是否實作起來更簡潔,更單純呢?其實不然,讓我們了解一下程式運作内部發生了哪些事情:

經編譯後程式的bytecode(位元組碼)展示出了實質: 在用String類對象直接拼接時,JVM會建立一個臨時的StringBuffer類對象,并調用其append()方法完成字元串的拼接,這是因為String類是不可變的,拼接操作不得不使用StringBuffer類(并且--JVM會将"You are nice."和"I love you so much."建立為兩個新的String對象)。之後,再将這個臨時StringBuffer對象轉型為一個String,代價不菲!可見,在這一個簡單的一次拼接過程中,我們讓程式建立了四個對象:兩個待拼接的String,一個臨時StringBuffer,和最後将StringBuffer轉型成為的String--它當然不是最初的str了,這個引用的名稱沒變,但它指向了新的String對象。

而如果直接使用StringBuffer類,程式将隻産生兩個對象:最初的StringBuffer和拼接時的String("I love you so much."),也不再需要建立臨時的StringBuffer類對象而後還得将其轉換回String對象。

可以想象,當我們的字元串要被循環拼接若幹段時,用String類直接操作會帶來多少額外的系統開銷,生成多少無用的臨時StringBuffer對象,并處理多少次無謂的強制類型轉換哪。

String 類

    String 類提供了幾種字元串建立方法。

    String s = "abcd" 使用字元串常量自動建立String執行個體。

    String s = new String(String s)通過String 對象或字元串常量傳遞給構造方法。

    public String (char value[],int offset, int count)将字元數組一部分賦給String 構造方法,offset 為起始下表, count 為數組長度。

    String 類提供了豐富的字元串操作方法,其中重要的例舉如下。

    public int lenght() 傳回字元串的長度。

    public char charAt(int index) 傳回字元串位置index處的字元。

    public boolean equals(Object o) 比較兩個字元串對象,相等則傳回true;反之傳回false。

    public int compareTo(String s) 比較兩個字元串字典順序,相等傳回0,s大于目前字元串傳回一個負值,s小于目前串傳回一個正值。

    public boolean regionMatches(int toffset,String other,int ooffset,int len)從目前字元串位置toffset開始尋找字元串other中起始位置為ooffset 長度為len 的子串。如發現比對,傳回true; 否則,傳回false。

    public boolean startsWith(String prefix) 從目前字元串的起始位置開始尋找字元串 prefix。如發現比對,傳回true;否則,傳回false。

    public boolean endsWith(String suffix) 如目前字元串的結尾子串與 suffix 比對,傳回true;否則,傳回false。

    public int indexOf(String str) 在目前字元串中尋找與str比對的子串,傳回首次比對的起始下表值;無比對傳回-1。

    public String substring(int beginIndex,int endIndex) 在目前字元串中,求從起始位置 beginIndex 到結束位置 endIndex 的子串。

    public String concat(String str) 将目前字元串與str連接配接,傳回連接配接後的字元串。

    public String toLowerCase() 将目前字元串全轉換為小寫形式。

    public String toUpperCase() 将目前字元串轉換為大寫形式。

    public char toCharArray() 将目前字元串轉換為字元數組。

    public Static String valueOf(type variable) 把variable 轉換為字元串,其中 type 表示 variable 的資料類型。

StringBuffer類

    String類實作一種不能改變的靜态字元串,StringBuffer類實作一種動态可以改變的字元串。StringBuffer類可以用于建立String類,StringBuffer一旦建立,可以用toString()方法将其轉換為String類,以後,就可以使用String 類方法來操作。

    StringBuffer 類提供了三種建立方法。

    public StringBuffer()    建立一個空的StringBuffer類。

    public StringBuffer(int length)    建立一個大小為length的StringBuffer類。

    public StringBuffer(String str)    按str建立一個動态可變的StringBuffer類。

    StringBuffer    類提供的方法主要用于把輸入的資料轉換為String類。輸入資料可來自鍵盤或其他資料源。類型可以是字元,字元數組,證書,浮點數和Object類型等。

    public int length()    傳回緩沖區的字元數

    public int capacity()    傳回緩沖區的容量大小,其值為:字元串長度+16。

    public synchronized StringBuffer append(type variable)    把variable轉換為字元串,然後與目前字元串連接配接。

    public synchronized StringBuffer append(Char(char ch))    把字元ch連接配接到目前串尾。

    public synchronized StringBuffer insert(int offset,type variable)    把variable轉換為字元串,然後插入到目前串中由offset指定的位置。

    public synchronized StringBuffer insert(int offset,char ch)    把字元 ch 插入到目前串由ofset指定的位置。

    public synchronized String toString()    把StringBuffer轉換為字元串String。各個方法的使用,具體請參閱 JAVA API文檔。