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對象都有一定的緩衝區容量,當字符串大小沒有超過容量時,不會分配新的容量,當字符串大小超過容量時,會自動增加容量 | 可變類,速度更快 |
不可變 | 可變 | 可變 |
線程安全 | 線程不安全 | |
多線程操作字符串 | 單線程操作字符串 |