平常我自己寫程式的時候,用到字元串第一反應總是String,然而Java類庫裡提供的字元串類卻不僅僅是String,下面就來做個比較。在不清楚Java類庫怎麼用的時候最直接的就是百度,但百度到的往往也是個人做的解析,不夠官方;官方點的就是看API文檔了,就是有點費神;當然,還有最暴力的,看源碼
String、StringBuffer 和StringBuilder 都在java.lang包中。
String類是不可變類,即一旦一個String對象被建立以後,包含在這個對象中的字元序列是 不可改變的,直至這個對象被銷毀。API文檔中是這樣描述的
java.lang
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
類代表字元串。 Java程式中的所有字元串文字(例如String
"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
表示UTF-16格式的字元串,其中補充字元由代理對表示 (有關詳細資訊,請參閱Character課程中的String
部分)。 索引值是指Character
代碼單元,是以補充字元在String中使用兩個char
。String
類提供處理Unicode代碼點(即字元)的方法,以及用于處理Unicode代碼單元(即String
值)的方法。char
StringBuffer對象則代表一個字元序列可變的字元串,當一個StringBuffer對象被建立以後,通過StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改變這個字元串對象的字元序列。一旦通過StringBuffer生成了最終想要的字元串,就可以調用它的toString()方法将其轉換成一個String對象。
java.lang
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。
java.lang
Class StringBuilder
- java.lang.Object
-
- java.lang.StringBuilder
-
- All Implemented Interfaces:
- Serializable , Appendable , CharSequence
一個可變的字元序列。 此類提供與public final class StringBuilder extends Object implements Serializable, CharSequence
的API,但不保證同步。 此類設計用作簡易替換為StringBuffer
在正在使用由單個線程字元串緩沖區的地方(如通常是這種情況)。 在可能的情況下,建議使用這個類别優先于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