平常我自己寫程序的時候,用到字符串第一反應總是String,然而Java類庫裏提供的字符串類卻不僅僅是String,下面就來做個比較。在不清楚Java類庫怎麼用的時候最直接的就是百度,但百度到的往往也是個人做的解析,不夠官方;官方點的就是看API文檔了,就是有點費神;當然,還有最暴力的,看源碼
String、StringBuffer 和StringBuilder 都在java.lang包中。
String類是不可變類,即一旦一個String對象被創建以後,包含在這個對象中的字符序列是 不可改變的,直至這個對象被銷燬。API文檔中是這樣描述的
Class String
- java.lang.Object
- java.lang.String
- All Implemented Interfaces:
- Serializable , CharSequence , Comparable < String >
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
String
類代表字符串。 Java程序中的所有字符串文字(例如"abc"
)都被實現爲此類的實例。字符串不變; 它們的值在創建後不能被更改。 字符串緩衝區支持可變字符串。 因爲String對象是不可變的,它們可以被共享。 例如:
String str = "abc";
相當於:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
以下是一些如何使用字符串的示例:
System.out.println("abc"); String cde = "cde"; System.out.println("abc" + cde); String c = "abc".substring(2,3); String d = cde.substring(1, 2);
String
類包括用於檢查序列的各個字符的方法,用於比較字符串,搜索字符串,提取子字符串以及創建將所有字符翻譯爲大寫或小寫的字符串的副本。 案例映射基於Character
類指定的Unicode標準版本。Java語言爲字符串連接運算符(+)提供特殊支持,併爲其他對象轉換爲字符串。 字符串連接是通過
StringBuilder
(或StringBuffer
)類及其append
方法實現的。 字符串轉換是通過方法來實現toString
,由下式定義Object
和繼承由在Java中的所有類。 有關字符串連接和轉換的其他信息,請參閱Gosling,Joy和Steele, Java語言規範 。除非另有說明,否則傳遞null參數到此類中的構造函數或方法將導致拋出
NullPointerException
。A
String
表示UTF-16格式的字符串,其中補充字符由代理對錶示 (有關詳細信息,請參閱Character課程中的Character
部分)。 索引值是指char
代碼單元,所以補充字符在String中使用兩個String
。String
類提供處理Unicode代碼點(即字符)的方法,以及用於處理Unicode代碼單元(即char
值)的方法。
StringBuffer對象則代表一個字符序列可變的字符串,當一個StringBuffer對象被創建以後,通過StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改變這個字符串對象的字符序列。一旦通過StringBuffer生成了最終想要的字符串,就可以調用它的toString()方法將其轉換成一個String對象。
Class StringBuffer
- java.lang.Object
- java.lang.StringBuffer
- All Implemented Interfaces:
- Serializable , Appendable , CharSequence
public final class StringBuffer extends Object implements Serializable, CharSequence
線程安全,可變的字符序列。 字符串緩衝區就像一個String
,但可以修改。 在任何時間點,它包含一些特定的字符序列,但可以通過某些方法調用來更改序列的長度和內容。字符串緩衝區可以安全地被多個線程使用。 這些方法在必要時進行同步,以便任何特定實例上的所有操作都按照與所涉及的各個線程所執行的方法調用順序一致的順序發生。
StringBuffer的主要
StringBuffer
是append
和insert
方法,它們被重載以便接受任何類型的數據。 每個都有效地將給定的數據轉換爲字符串,然後將該字符串的字符附加或插入到字符串緩衝區。append
方法總是在緩衝區的末尾添加這些字符;insert
方法將insert
添加到指定點。例如,如果
z
是指當前內容爲"start"
的字符串緩衝區對象,那麼方法調用z.append("le")
將使字符串緩衝區包含"startle"
,而z.insert(4, "le")
會將字符串緩衝區更改爲包含"starlet"
。一般情況下,如果某人是指的一個實例
StringBuffer
,則sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每當涉及源序列(例如從源序列追加或插入)的操作發生時,該類僅在執行操作的字符串緩衝器上進行同步,而不在源上。 請注意,雖然
StringBuffer
被設計爲可以安全地從多個線程併發使用,但如果構造函數或append
或insert
操作被傳遞通過線程共享的源序列,則調用代碼必須確保該操作具有一致且不變的視圖在操作期間的源序列。 呼叫者通過使用不可變的源序列,或者不跨線程共享源序列,可以在呼叫期間持有鎖來滿足這一點。每個字符串緩衝區都有一個容量。 只要字符串緩衝區中包含的字符序列的長度不超過容量,就不必分配新的內部緩衝區數組。 如果內部緩衝區溢出,則會自動變大。
除非另有說明,否則將
null
參數傳遞給null
中的構造函數或方法將導致拋出NullPointerException
。從版本JDK 5開始,這個類別已經被一個等級類補充了,這個類被設計爲使用一個線程
StringBuilder
。StringBuilder
應該使用StringBuilder
類,因爲它支持所有相同的操作,但它更快,因爲它不執行同步。
StringBuilder類是JDK1.5新增的,它也代表字符串對象。StringBuilder 和StringBuffer 基本類似,不過StringBuffer是線程安全的,而StringBuilder沒有實現線程安全功能,所以性能略高。不考慮線程安全的情況下,要創建內容可變的字符串時應優先考慮使用StringBuilder。
Class StringBuilder
- java.lang.Object
- java.lang.StringBuilder
- All Implemented Interfaces:
- Serializable , Appendable , CharSequence
public final class StringBuilder extends Object implements Serializable, CharSequence
一個可變的字符序列。 此類提供與StringBuffer
的API,但不保證同步。 此類設計用作簡易替換爲StringBuffer
在正在使用由單個線程字符串緩衝區的地方(如通常是這種情況)。 在可能的情況下,建議使用這個類別優先於StringBuffer
,因爲它在大多數實現中將更快。StringBuilder的主要
StringBuilder
是append
和insert
方法,它們是重載的,以便接受任何類型的數據。 每個都有效地將給定的數據轉換爲字符串,然後將該字符串的字符附加或插入字符串構建器。append
方法始終在構建器的末尾添加這些字符;insert
方法將insert
添加到指定點。例如,如果
z
引用當前內容爲“start
”的字符串構建器對象,那麼方法調用z.append("le")
將導致字符串構建器包含“startle
”,而z.insert(4, "le")
會將字符串構建器更改爲包含“starlet
”。一般情況下,如果某人是指的一個實例
StringBuilder
,則sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每個字符串構建器都有一個容量。 只要字符串構建器中包含的字符序列的長度不超過容量,則不需要分配新的內部緩衝區。 如果內部緩衝區溢出,則會自動變大。
StringBuilder的
StringBuilder
不能安全使用多線程。 如果需要同步, 那麼建議使用StringBuffer
。除非另有說明,否則將
null
參數傳遞給null
中的構造函數或方法將導致拋出NullPointerException
。
API文檔對應的JDK版本爲1.8