String,StringBuffer、StringBuilde 詳細介紹

String,StringBuffer、StringBuilde 詳細介紹

JAVA中用於處理字符串常用的有三個類:

java.lang.String、

java.lang.StringBuffer、

java.lang.StringBuilder,

這三者的共同之處都是 final 類,不允許被繼承,這主要是從性能和安全性上考慮的,因爲這幾個類都是經常被使用着的,且考慮到防止其中的參數被修改影響到其它的應用。

StringBuffer StringBuilder 兩個基本上差不多,只是 StringBuffer 是線程安全,可以不需要額外的同步用於多線程中;

StringBuilder 是非同步,運行於多線程中就需要使用着單獨同步處理,但是速度就比 StringBuffer 快多了;二者之間的共同點都可以通過append、insert進行字符串的操作。

String 實現了三個接口:Serializable、Comparable<String>、CharSequence,

而 StringBuffer 及 StringBuilder 只實現了兩個接口 Serializable、CharSequence,相比之下 String 的實例可以通過 compareTo 方法進行比較,而其它兩個就不可以。

以下是JDK中對StringStringBufferStringBuilder的詳細介紹:

String

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 合著的 The Java Language Specification。

除非另行說明,否則將 null 參數傳遞給此類中的構造方法或方法將拋出 NullPointerException

String 表示一個 UTF-16 格式的字符串,其中的增補字符 由代理項對 表示(有關詳細信息,請參閱 Character 類中的 Unicode 字符表示形式)。索引值是指 char 代碼單元,因此增補字符在 String 中佔用兩個位置。

String 類提供處理 Unicode 代碼點(即字符)和 Unicode 代碼單元(即 char 值)的方法。

StringBuffer

線程安全的可變字符序列。一個類似於 String 的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。

可將字符串緩衝區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符添加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而 insert 方法則在指定的點添加字符。

例如,如果 z 引用一個當前內容是“start”的字符串緩衝區對象,則此方法調用 z.append("le") 會使字符串緩衝區包含“startle”,而 z.insert(4, "le") 將更改字符串緩衝區,使之包含“starlet”。

通常,如果 sb 引用 StringBuilder 的一個實例,則 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。

只要發生有關源序列(如在源序列中添加或插入)的操作,該類就只在執行此操作的字符串緩衝區上而不是在源上實現同步。

每個字符串緩衝區都有一定的容量。只要字符串緩衝區所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩衝區數組。如果內部緩衝區溢出,則此容量自動增大。從 JDK 5 開始,爲該類補充了一個單個線程使用的等價類,即 StringBuilder。與該類相比,通常應該優先使用 StringBuilder 類,因爲它支持所有相同的操作,但由於它不執行同步,所以速度更快。

StringBuilder

一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比 StringBuffer 要快。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章