StringBuffer和StringBuilder继承了抽象类AbstractStringBuilder,实现了java.io.Serializable, CharSequence两个接口
在阅读时应该两个源码对比起来阅读,这样可以分辨出这两个非常相似的类的区别和相同之处,以便于更加好的区别应用。这两个类都是继承了相同的类,和实现了相同的接口,所以从value属性的源码来看,这两个类都是可变的
首先想到一次面试过程中被问到为什么String是不可变的,所以阅读的时候特地注意了一下,并且记录下来。
/**
* The value is used for character storage.
*这个属性来自于所继承的AbstractStringBuilder中,用于存储字符串信息
*/
char[] value;
/**
* The value is used for character storage.
* 这是String中的属性,这个属性被final修饰,所以在String是不可以被二次修改的,即不可变
*/
private final char value[];
在调用构造时,除了 StringBuilder(int capacity)这个方法以外,都会在末尾加上大小为16的空间
区别:
在属性上看,StringBuffer比StringBuilder多了toStringCache
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
* transient:在序列化是以transient修饰的变量不会被序列化。
* 该属性在调用ToString时记录下最近一次value值,而在修改这个value时,会将这个置为null
*/
private transient char[] toStringCache;
在方法上看,StringBuffer的所有方法都是被synchronized所修饰的,所以相比与StringBuilder来说,StringBuffer是线程安全的。不过由于被synchronized所修饰的,所以在效率上来说,StringBuilder的效率要比StringBuffer高的多。StringBuffer所抽象类AbstractStringBuilder中的大多数方法都进行了重写,而StringBuilder并没有。