1. 简述
关于StringBuffer、StringBuilder、String算是老生常谈的问题,今天抽空整理下部分细节。先大概看下类图,StringBuilder和StringBuilder的继承是完全一致的,当然String本身也是实现Serializable和CharSequence接口的,三者类都是由final修饰的也就是具备final修饰的特性不能被继承。
2. 三者拼接字符串的操作实现
String的拼接很简单直接加号操作即可,这样就会创建的新的String对象分配内存空间。大量的拼接或者循环里面操作字符串不推荐使用加号。
StringBuffer、StringBuilder的拼接是调用的append()方法,同时这个方法是源自于他们的父类AbstractStringBuilder的append() 方法,通过下面append() 方法的源码可以看出,StringBuffer之所以线程安全因为它的方法是由synchronizaed 修饰的同步执行。两者在操作字符串的过程中是统一用的是转字符数组进行拼接操作,这样就避免了新的String对象的创建。
// StringBuffer 的append方法
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
// StringBuilder 的append方法
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
// 父类AbstractStringBuilder 的append方法
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
if (srcBegin < 0) {
throw new StringIndexOutOfBoundsException(srcBegin);
}
if (srcEnd > value.length) {
throw new StringIndexOutOfBoundsException(srcEnd);
}
if (srcBegin > srcEnd) {
throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
}
System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}
3. 三者区别总结
如有披露或问题欢迎留言或者入群探讨