“簡單不先于復(fù)雜糊余,而是在復(fù)雜之后.” —— Alan Perlis
Java中有三種字符串類型:String秀又、StringBuilder、StringBuffer贬芥,那么它們之間有什么區(qū)別呢吐辙,又應(yīng)該在怎樣的場景中使用?
String
String是字符串常量蘸劈,一旦創(chuàng)建之后就不可以改變其內(nèi)容昏苏,即是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贤惯,因此只能賦值一次,之后不能再被修改棒掠。有些同學(xué)可能會問孵构,String在賦值之后,是可以被重新賦值的啊烟很,其實(shí)颈墅,它是創(chuàng)建一個新的String來實(shí)現(xiàn)的。如下代碼:
public static void main(String[] args)
{
String a = "hello";
System.out.println(a.hashCode());
a = "world";
System.out.println(a.hashCode());
}
輸出的兩行結(jié)果不一樣的雾袱,說明a被重新賦值之后恤筛,跟賦值前不是同一個對象。
StringBuffer
StringBuffer跟String區(qū)別是芹橡,前者是可變的毒坛,是字符串變量,而且林说,StringBuffer是線程安全的煎殷。如果需要頻繁修改字符串內(nèi)容,就可以使用StringBuffer腿箩。
StringBuffer 上的主要操作是 append 和 insert 方法蝌数,可重載這些方法,以接受任意類型的數(shù)據(jù)度秘。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串顶伞,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append 方法始終將這些字符添加到緩沖區(qū)的末端剑梳;而 insert 方法則在指定的點(diǎn)添加字符唆貌。
StringBuilder
StringBuilder也是一個字符串變量,但它是非線程安全的垢乙。這個類是在JDK5.0新增的锨咙,它是設(shè)計(jì)作為StringBuffer的一個簡易替換,用于單線程使用的情況(很普遍)追逮。由于它是非線程安全酪刀,因此在效率上是快于線程安全的StringBuffer粹舵。
三者區(qū)別
String是字符串常量,StringBuffer骂倘、StringBuilder是字符變量
StringBuffer是線程安全的眼滤,StringBuilder是非線程安全的
使用場景
如果只操作少量數(shù)據(jù),建議使用String历涝;單線程操作大量數(shù)據(jù)诅需,使用StringBuilder;多線程操作大量數(shù)據(jù)則使用StringBuffer
不要使用String的+來進(jìn)行頻繁的字符串拼接操作荧库,應(yīng)用使用StringBuffer或StringBuilder
為了獲得更好的性能堰塌,在構(gòu)造 StirngBuffer 或StirngBuilder 時(shí)應(yīng)盡可能指定它們的容量。當(dāng)然分衫,如果你操作的字符串長度(length)不超過 16 個字符就不用了场刑,當(dāng)不指定容量(capacity)時(shí)默認(rèn)構(gòu)造一個容量為16的對象。不指定容量會顯著降低性能
StringBuilder一般使用在方法內(nèi)部來完成類似"+"功能蚪战,因?yàn)槭蔷€程不安全的摇邦,所以用完以后可以丟棄。StringBuffer主要用在全局變量中屎勘。