String ,StringBuilder 和StringBuffer的區別

1、String:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

用於存放字符的數組被聲明爲final的,因此只能賦值一次,不可再更改。

2 StringBuffer(JDK1.0)

StringBuffer&StringBudiler  都繼承自AbstractStringBuilder類

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

   // StringBuilder 構造
   public StringBuilder() {
        super(16);
    }

用於存放字符的數組沒有被聲明爲final的,因此可以擴展,

StringBuffer:字符串變量(Synchronized,即線程安全)。如果要頻繁對字符串內容進行修改,出於效率考慮最好使用StringBuffer,如果想轉成String類型,可以調用StringBuffer的toString()方法。

Java.lang.StringBuffer線程安全的可變字符序列。在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。可將字符串緩衝區安全地用於多個線程。

3 StringBuilder(JDK5.0)

StringBuilder:字符串變量(非線程安全)。在內部,StringBuilder對象被當作是一個包含字符序列的變長數組。

java.lang.StringBuilder是一個可變的字符序列,是JDK5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。

 

構造方法 描述
StringBuilder() 創建一個容量爲16的StringBuilder對象(16個空元素)
StringBuilder(CharSequence cs) 創建一個包含cs的StringBuilder對象,末尾附加16個空元素
StringBuilder(int initCapacity) 創建一個容量爲initCapacity的StringBuilder對象
StringBuilder(String s) 創建一個包含s的StringBuilder對象,末尾附加16個空元素

在大部分情況下,StringBuilder > StringBuffer。這主要是由於前者不需要考慮線程安全。

4 三者區別

String 類型和StringBuffer的主要性能區別:String是不可變的對象, 因此在每次對String 類型進行改變的時候,都會生成一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因爲每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,性能就會降低。使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用。所以多數情況下推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下

 5、三者區別可參照下表:

String Stringbuffer StringBuilder
String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,不僅效率低下,而且浪費大量優先的內存空間 StringBuffer是可變類,和線程安全的字符串操作類,任何對它指向的字符串的操作都不會產生新的對象。每個StringBuffer對象都有一定的緩衝區容量,當字符串大小沒有超過容量時,不會分配新的容量,當字符串大小超過容量時,會自動增加容量 可變類,速度更快
不可變 可變 可變
  線程安全 線程不安全
  多線程操作字符串 單線程操作字符串

 

 

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