StringBuild与StringBuffer的区别
线程安全
StringBuffer
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
StringBuild
public StringBuilder append(String str) {
super.append(str);
return this;
}
区别:
- 在StringBuffer中append追加字符方法有同步代码块synchronize修饰,保证线程同步
- StringBuild中就没有同步代码块,无法保证线程安全
缓冲区
StringBuffer
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
* toString返回的最后一个值的缓存。 每当修改StringBuffer时清除。
*/
private transient String toStringCache;
public synchronized String toString() {
if (toStringCache == null) {
return toStringCache =
isLatin1() ? StringLatin1.newString(value, 0, count)
: StringUTF16.newString(value, 0, count);
}
return new String(toStringCache);
}
StringBuild
public String toString() {
// Create a copy, don't share the array
// 复制一个数组,但是不分享这个数组
return isLatin1() ? StringLatin1.newString(value, 0, count)
: StringUTF16.newString(value, 0, count);
}
- 从上面代码看出,StringBuf每次对字符串进行操作时候有一个临时变量,每次操作都拿着个Cache临时变量操作
- 每次做新的操作时候都清除这个缓存
- 而StringBuild每次操作都是new一个数组,但不分享这个数组,再对这个数组进行操作,没有缓冲区
速度/效率
- 因为StringBuffer使用同步代码块技术,导致运行效率比不使用同步技术的StringBuild低,而且StringBuild也没有缓冲区,效率高