从这里看不出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的效率自然更高。