複製鏈接
請複製以下鏈接發送給好友

StringBuilder

鎖定
StringBuilder是一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。
中文名
一個可變的字符序列
外文名
StringBuilder
所屬學科
IT
所屬領域
程序編寫
所屬科目
C#
來    源
jdk1.5及以後的版本

StringBuilder簡介

如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符添加或插入到字符串生成器中。append 方法始終將這些字符添加到生成器的末端;而 insert 方法則在指定的點添加字符。 例如,如果 z 引用一個當前內容為“start”的字符串生成器對象,則該方法調用 z.append("le") 將使字符串生成器包含“startle”,而 z.insert(4, "le") 將更改字符串生成器,使之包含“starlet”。 通常,如果 n引用 StringBuilder 的實例(StringBuilder n = new StringBuilder();),則 n.append(x) 和 n.insert(n.length(), x) 具有相同的效果。 每個字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩衝區。如果內部緩衝區溢出,則此容量自動增大。 將StringBuilder的實例用於多個線程是不安全的。如果需要這樣的同步,則建議使用StringBuffer [1]  StringBuilder類可以用於在無需創建一個新的字符串對象情況下修改字符串。StringBuilder不是線程安全的,而StringBuffer是線程安全的。但StringBuilder在單線程中的性能比StringBuffer高。

StringBuilder來源

StringBuilder據我所知,是C sharp(C#)中先有的。
在Java中,首先出現的是StringBuffer,而StringBuilder類來源於jdk1.5及以後的版本,jdk1.4(包括1.4)之前是不存在該類的。請注意不要在jdk1.4的環境裏使用StringBuilder類,否則會出錯。

StringBuilder區別

StringBuffer 和 StringBuilder 類的區別
StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。
由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的情況下,則必須使用 StringBuffer 類。
public class Test{   public static void main(String args[]){
    StringBuffer sBuffer = new StringBuffer("菜鳥教程官網:");    
    sBuffer.append("www");    
    sBuffer.append(".runoob");    
    sBuffer.append(".com");    
    System.out.println(sBuffer);     
    }}   
以上實例編譯運行結果如下:
菜鳥教程官網:www.runoob.com

StringBuilderStringBuilder原理

StringBuilder的原理和StringBuffer一樣,不同之處在於StringBuilder不需要考慮線程安全。具體的原理參見另一篇StringBuffer詳解 [2] 

StringBuilder常用方法

StringBuilder的常用方法和StringBuffer的一樣。列出如下:

StringBuilder構造函數

StringBuilder有四個構造函數:
StringBuilder() value內容為空,並設置容量為16個字節;
StringBuilder(CharSequece seq) 使用seq初始化,容量在此基礎上加16;
StringBuilder(int capacity) 設置特定容量;
StringBuilder(String str) 使用str初始化,容量str大小的基礎上加16;

StringBuilderappend方法

由於繼承了Appendable接口,所以要實現append方法,StringBuilder類對幾乎所有的基本類型都重載了append方法:
append(boolean b)
append(char c)
append(char[] str)
append(char[] str,int offset,int len)
append(CharSequence s)
append(CharSequence s,int start,int end)
append(double d)
append(float f)
append(int i)
append(long lng)
append(Object obj)
append(String str)
append(StringBuffer sb)

StringBuilderinsert方法

insert方法可以控制插入的起始位置,也幾乎對所有的基本類型都重載了insert方法:
insert(int offser,boolean b)
insert(int offset,char c)
insert(int offset,char[] str)
insert(int index,char[] str,int offset,int len)
insert(int dsfOffset,CharSequence s)
insert(int dsfOffset,CharSequence s,int start,int end)
insert(int offset,double d)
insert(int offset,float f)
insert(int offset,int i)
insert(int offset,long l)
insert(int offset,Object obj)
insert(int offset,String str)

StringBuilder其它會改變內容的方法

上面的那些方法會增加StringBuilder的內容,還有一些方法可以改變StringBuilder的內容:
StringBuilder delete(int start,int end) 刪除從start到end(不包含)之間的內容;
StringBuilder deleteCharAt(int index) 刪除index位置的字符;
StringBuilder replace(int start,int end,String str) 用str中的字符替換value中從start到end位置的子序列;
StringBuilder reverse() 反轉;
void setCharAt(int index,char ch) 使用ch替換位置index處的字符;
void setLength(int newLength) 可能會改變內容(添加'\0');

StringBuilder其它常用方法

下面這些方法不會改變內容:
int capacity() 返回value的大小即容量;
int length() 返回內容的大小,即count;
char charAt(int index) 返回位置index處的字符;
void ensureCapacity(int minimumCapacity) 確保容量至少是minimumCapacity;
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) 返回srcBegin到srcEnd的字符到dst;
int indexOf(String str) 返回str第一次出現的位置;
int indexOf(String str,int fromIndex) 返回從fromIndex開始str第一次出現的位置;
int lastIndexOf(String str) 返回str最後出現的位置;
int lastIndexOf(String str,int fromIndex) 返回從fromIndex開始最後一次出現str的位置;
CharSequence subSequence(int start,int end) 返回字符子序列;
String substring(int start) 返回子串;
String substring(int start,int end) 返回子串;
String toString() 返回value形成的字符串;
void trimToSize() 縮小value的容量到真實內容大小;
參考資料