天天看點

Java常用類——String、StringBuffer 和StringBuilder類

    平常我自己寫程式的時候,用到字元串第一反應總是String,然而Java類庫裡提供的字元串類卻不僅僅是String,下面就來做個比較。在不清楚Java類庫怎麼用的時候最直接的就是百度,但百度到的往往也是個人做的解析,不夠官方;官方點的就是看API文檔了,就是有點費神;當然,還有最暴力的,看源碼

Java常用類——String、StringBuffer 和StringBuilder類

    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      

    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

     。

    String

    表示UTF-16格式的字元串,其中補充字元由代理對表示 (有關詳細資訊,請參閱Character課程中的

    Character

    部分)。 索引值是指

    char

    代碼單元,是以補充字元在String中使用兩個

    String

     。

    String

    類提供處理Unicode代碼點(即字元)的方法,以及用于處理Unicode代碼單元(即

    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      
    一個可變的字元序列。 此類提供與

    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