1. 程式人生 > >Java常用類(三)之StringBuffer與StringBuidler

Java常用類(三)之StringBuffer與StringBuidler

lane 這一 eight cit 優先 simple bmp imp uid

前言

  前面一篇給大家介紹了String類,這個我們經常會用到的一個類,那這一篇給大家分享的是StringBuffer與StringBuidler。等下我也會比較他們三個之間的區別

一、StringBuffer

1.1、概述

  技術分享

  Java.lang.StringBuffer線程安全的可變字符序列。一個類似於 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容
  可將字符串緩沖區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。


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

  append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符
  例如,如果 z 引用一個當前內容是“start”的字符串緩沖區對象,則此方法調用 z.append("le") 會使字符串緩沖區包含“startle”,而 z.insert(4, "le") 將更改字符串緩沖區,使之包含“starlet”。

1.2、構造方法

   技術分享

  什麽是CharSequence?

    CharSequence 是 char 值的一個可讀序列。此接口對許多不同種類的 char 序列提供統一的只讀訪問。char 值表示 Basic Multilingual Plane (BMP) 或代理項中的一個字符。

    技術分享

1.3、常用方法

  1)append()方法

    技術分享

  2)capacity()方法

    技術分享

  3)charAt(int index)方法

  4)delete()方法

    技術分享

  5)indexOf(String str)

    技術分享

  5)insert()方法

    技術分享

  6)length()方法

  7)reverse()方法

    技術分享

  8)substring()方法

    技術分享

  9)toString()方法

    技術分享

二、StringBuilder

2.1、概述

  那我們來看一下:AbstractStringBuilder這個抽象類:

    技術分享

  它實現類一些基本的方法。

  技術分享

  java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,

  用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同

2.2、構造方法

  技術分享

2.3、常用方法

  和上面的StringBuffer上的基本相同

三、String、StringBuffer、StringBuilder之間的區別

  首先需要說明的是:   

    String 字符串常量
    StringBuffer 字符串變量(線程安全)
    StringBuilder 字符串變量(非線程安全)

  在大多數情況下三者在執行速度方面的比較:StringBuilder > StringBuffer > String

  解釋:

  String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,

  然後將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。

  而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。

  

  為什麽是大多數情況呢?

  在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 效率是遠要比 StringBuffer 快的:
    String S1 = “This is only a” + “ simple” + “ test”;
    StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
  你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優勢。其實這是 JVM 的一個把戲,在 JVM 眼裏,這個
   String S1 = “This is only a” + “ simple” + “test”; 其實就是:String S1 = “This is only a simple test”;
  所以當然不需要太多的時間了。但大家這裏要註意的是,如果你的字符串是來自另外的 String 對象的話,速度就沒那麽快了,譬如:
    String S2 = “This is only a”;
    String S3 = “ simple”;
    String S4 = “ test”;

  大部分情況下StringBuilder的速度要大於StringBuffer:

    java.lang.StringBuilder一個可變的字符序列是5.0新增的。(大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的)此類提供一個與 StringBuffer 兼容的 API,

    但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。

 

對於三者使用的總結:

    1)如果要操作少量的數據用 = String
    2)單線程操作字符串緩沖區 下操作大量數據 = StringBuilder
    3)多線程操作字符串緩沖區 下操作大量數據 = StringBuffer

  

Java常用類(三)之StringBuffer與StringBuidler