查看Java(1.6)源码发现StringBuffer与StringBuilder的定义如下:
public final class StringBuffer extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
...}
public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
...}
可见,StringBuffer与StringBuilder拥有共同的父类AbstractStringBuilder,并实现了相同的接口java.io.Serializable, CharSequence
接着阅读代码,发现StringBuffer与StringBuilder的大部分方法都类似,不同的地方是,StringBuffer的大部分方法都用Synchronized修饰,而StringBuilder没有。例如
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
public synchronized StringBuffer append(StringBuffer sb) {
super.append(sb);
return this;
}
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
private StringBuilder append(StringBuilder sb) {
if (sb == null)
return append("null");
int len = sb.length();
int newcount = count + len;
if (newcount > value.length)
expandCapacity(newcount);
sb.getChars(0, len, value, count);
count = newcount;
return this;
}
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
可见,StringBuffer是保证操作同步的,可以安全地用于多线程,可以在必要时对这些方法同步,因此特定实例上的操作就好像串行发生一样; StringBuilder不是线程安全的,可以理解为StringBuffer的一个简易替代,用于字符串缓冲区只被单个线程使用的情况(很普遍)。因此如何只在单个线程中操纵字符串,优先使用StringBuilder,由于不用同步控制,所以速度比StringBuffer要快。
继续阅读代码,StringBuffer和StringBuilder的共同父类AbstractStringBuilder的部分代码如下,
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char value[];
/**
* The count is the number of characters used.
*/
int count;
...
}
public int length() {
return count;
}
public int capacity() {
return value.length;
}
public void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > value.length) {
expandCapacity(minimumCapacity);
}
}
void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}
可见,StringBuffer与StringBuilder的底层实现都是基于数组,并且支持动态扩展容量的。
附:String与StirngBuilder的区别
String的定位是字符串常量的表示,在涉及到字符串拼接时,由于String对象不可变,因此是生成新的字符串对象。而StringBuilder则不用生成新的对象。
从JDK1.5开始,带有字符串的连接操作(+),JVM内部采用的是StringBuilder来实现的(即源码编译后的实现)。
参看:http://www.jb51.net/article/86551.htm