String 系列:
在前面的三篇文章,我们对 String 底层结构及常用方法的源码进行了分析,本篇我们就来看看 StringBuilder…
StringBuilder原理?为什么拼接效率高于String?
StringBuilder的方法实质上是调用父类AbstractStringBuilder的
abstract class AbstractStringBuilder implements Appendable, CharSequence {
// 实质上也是char[],但他不是final的==>也就是说,在数组空间够大的情况下,一个数组可以存多个字符串
char[] value;
// 记录当前容量,扩容的前提
int count;
}
StringBuilder的append方法实际上就是调用父类AbstractStringBuilder的append方法
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
// 确保容量够,不够则扩容
// 扩容机制是2*capcity+2
ensureCapacityInternal(count + len);
// 将要append的string拷贝到当前数组,0表示从要拼接的字符串第一位开始拷贝
str.getChars(0, len, value, count);
count += len;
return this;
}
接效率高的原因?
- String是final的,一个数组只能给一个字符串使用,所以每拼接一次都要新创建然后拷贝一次数组
- StringBuilder虽然底层也是字符数组,但是他不final,即允许在容量充足的情况下,一个数组可以被拼接多次;
相应的StringBuilder也要有扩容机制
StringBuilder与StringBuffer的区别
StringBuffer线程安全,在append方法前面加上了synchronized,但相对效率就低了
public synchronized StringBuffer append(StringBuffer sb) {
toStringCache = null;
super.append(sb);
return this;
}