public final class String implements java.io.Serializable, Comparable<String>, CharSequence
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
从这里看不出StringBuffer和StringBuilder的不同,String多实现了一个Comparable接口。
接着看String:
/** The value is used for character storage. */
private final char value[];
可以看到String内部是通过一个字符数组来存储的,这个final就可以很好解释为什么String不可变了。
我们再看下StringBuffer和StringBuilder的父类AbstractStringBuilder:
/**
* The value is used for character storage.
*/
char[] value;
所以StringBuffer和StringBuilder是可变的。
这里贴几个StringBuffer中的方法:
@Override
public synchronized int length() {
return count;
}
@Override
public synchronized int capacity() {
return value.length;
}
@Override
public synchronized void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > value.length) {
expandCapacity(minimumCapacity);
}
}
可以发现都用synchronized修饰了,为了同步,加了锁。
而看StringBuilder源码中的方法,可以发现并没有加synchronized修饰,所以StringBuffer是线程安全的,而StringBuilder不是,而StringBuffer为了线程安全加了锁,自然会影响它的效率,所以StringBuilder的效率自然更高。