String 是字符串常量(線程安全);
StringBuffer(線程安全), StringBuilder(非線程安全) 是字符串變量。
String、StringBuilder、StringBuffer類定義
它們?nèi)齻€(gè)類都被final說(shuō)明這三個(gè)都是不可變類。
StringBuilder、StringBuffer這兩個(gè)類都繼承了AbstractStringBuilder。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
String、StringBuilder、StringBuffer創(chuàng)建
String類中包含一個(gè)不可變的char數(shù)組用來(lái)存放字符串
/** 這個(gè)value被用于存放char變量 */
private final char value[];
public String() {
this.value = "".value;
}
StringBuilder和SpringBuffer都使用父類的構(gòu)造函數(shù)進(jìn)行初始化,
public StringBuilder() {
super(16);
}
public StringBuffer() {
super(16);
}
父類的構(gòu)造方法,
可以看到和String類的區(qū)別是value類沒(méi)有使用final類去修飾,所以在高并發(fā)下對(duì)value的操作是不安全的。
char[] value;
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
String、StringBuilder、StringBuffer的操作
String的添加操作只需要使用+號(hào)連接就行
StringBuilder、StringBuffer則需要使用append方法進(jìn)行操作。
但是String使用+號(hào)操作,在jvm進(jìn)行編譯過(guò)后也是使用StringBuilder去進(jìn)行連接操作的。
StringBuilder、StringBuffer他們兩的append方法區(qū)別就在于StringBuilder沒(méi)有同步鎖,而StringBuffer加了同步鎖。
他們同時(shí)都是調(diào)用父類的方法進(jìn)行實(shí)現(xiàn)。
父類的append類似于Arraylist的add,在超出一定容量之后都是要對(duì)value數(shù)組進(jìn)行擴(kuò)容
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
總結(jié)
大部分情況下效率StringBuilder > StringBuffer > String
StringBuilder 和 StringBuffer在創(chuàng)建字符串對(duì)其進(jìn)行操作的適合都是使用的統(tǒng)一個(gè)對(duì)象,而String的value是不可變的數(shù)組所以每次需要構(gòu)造String的適合都是需要new出一個(gè)對(duì)象,再把這個(gè)對(duì)象引用過(guò)去,效率會(huì)很低下。