引言:
String、StringBuilder 、StringBuffer在面试中被问到的几率是非常多的。我们常常这样回答:
1.String是不可变的对象
2.StringBuffer是线程安全的,StringBuilder 不是线程安全的
3.StringBuilder 效率高于StringBuffer
如果面试官继续问StringBuffer、StringBuilder 它们底层是怎么实现字符串拼接的,为什么说StringBuffer是线程安全的?如果你没有了解它们底层源码肯定是回答不上。因此这篇文章我们来看看源码。
StringBuilder 源码:
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
static final long serialVersionUID = 4383685877147921099L;
//调用父类的构造函数,创建一个长度为16的字符数组
public StringBuilder() {
super(16);
}
//调用父类的构造函数,创建一个指定长度的字符数组
public StringBuilder(int capacity) {
super(capacity);
}
//调用父类的构造函数,传入初始值。构建一个16+初始值长度的数组
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
/**
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
@Override
public StringBuilder append(CharSequence s, int start, int end) {
super.append(s, start, end);
return this;
}
@Override
public StringBuilder append(char[] str) {
super.append(str);