“簡單不先于復雜,而是在復雜之后.” —— Alan Perlis
Java中有三種字符串類型:String、StringBuilder、StringBuffer,那么它們之間有什么區別呢,又應該在怎樣的場景中使用?
String
String是字符串常量,一旦創建之后就不可以改變其內容,即是immutable(不可變)的,其類的部分定義如下:
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
其中value[]是用來存儲字符串的,被聲明為final,因此只能賦值一次,之后不能再被修改。有些同學可能會問,String在賦值之后,是可以被重新賦值的啊,其實,它是創建一個新的String來實現的。如下代碼:
public static void main(String[] args)
{
String a = "hello";
System.out.println(a.hashCode());
a = "world";
System.out.println(a.hashCode());
}
輸出的兩行結果不一樣的,說明a被重新賦值之后,跟賦值前不是同一個對象。
StringBuffer
StringBuffer跟String區別是,前者是可變的,是字符串變量,而且,StringBuffer是線程安全的。如果需要頻繁修改字符串內容,就可以使用StringBuffer。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區中。append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符。
StringBuilder
StringBuilder也是一個字符串變量,但它是非線程安全的。這個類是在JDK5.0新增的,它是設計作為StringBuffer的一個簡易替換,用于單線程使用的情況(很普遍)。由于它是非線程安全,因此在效率上是快于線程安全的StringBuffer。
三者區別
String是字符串常量,StringBuffer、StringBuilder是字符變量
StringBuffer是線程安全的,StringBuilder是非線程安全的
使用場景
如果只操作少量數據,建議使用String;單線程操作大量數據,使用StringBuilder;多線程操作大量數據則使用StringBuffer
不要使用String的+來進行頻繁的字符串拼接操作,應用使用StringBuffer或StringBuilder
為了獲得更好的性能,在構造 StirngBuffer 或StirngBuilder 時應盡可能指定它們的容量。當然,如果你操作的字符串長度(length)不超過 16 個字符就不用了,當不指定容量(capacity)時默認構造一個容量為16的對象。不指定容量會顯著降低性能
StringBuilder一般使用在方法內部來完成類似"+"功能,因為是線程不安全的,所以用完以后可以丟棄。StringBuffer主要用在全局變量中。