天天看點

String、StringBuffer、StringBuilder小結

今天遇到一個關于字元串需要經常進行修改操作,怎樣合理選擇字元串對象的類的問題。

通過檢視jdk1.6官方文檔,總結如下:

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

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
}
           

通過檢視源碼發現,String類由final修飾,底層由字元數組來維護,當String對象建立時,會在堆記憶體裡面開辟一個記憶體空間,String類型的變量不能發生改變。如果需要對字元串做很多修改,那麼應該選擇使用StringBuffer或者StringBuilder。除了hash這個屬性其他屬性都聲明為final,由于不可變性,是以在進行拼接字元串的時候會産生很多無用的中間對象,使得性能降低。

我們來了解下面幾行代碼:

String str = "yh";
str = str+"yy";
           

雖然String類型的變量不可變,但是變量的指向是可以改變的。

String str ="yh"表示在記憶體裡面建立了一個内容為yh的String對象,然後str指向這個對象;str=str+"yy"表示将建立一個新的str對象來存放新的内容,原先建立的對象還在記憶體當中,但是str不再指向之前的那個對象,而原先那個對象會被java回收機制處理掉。

2.StringBuffer

StringBuffer提供append和insert方法,通過方法的調用來實作對字元串的修改,它的本質是一個線程安全的可修改的字元序列,在很多方法上都加上了synchronized,保證了線程安全,但降低了性能。

3.StringBuilder

從java1.5引入的概念,與StringBuffer的方法大緻相同,唯一的差別在于,線程的不安全性,性能很高,如果可以不用考慮線程安全性,優先使用StringBuilder。