Java常用类
StringBuffer和StringBuilder
是什么?字符串缓存区
工作原理:
预先在内存中申请一块空间,以容纳字符序列,如果预留的空间不够用,则进行自动扩容,以容纳更多的字符序列
StringBuffer、StringBuilder和String的区别:
String是不可变的字符序列,存储字符串常量池中
StringBuffer底层是一个char数组,但是该数组是可变的,并且可以自动扩容
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { /** * A cache of the last value returned by toString. Cleared * whenever the StringBuffer is modified. */ private transient char[] toStringCache; /** * Constructs a string buffer with no characters in it and an * initial capacity of 16 characters. */ public StringBuffer() { super(16); //默认容量为16 } public StringBuffer(int capacity) { super(capacity); } public StringBuffer(String str) { super(str.length() + 16); append(str); } }
StringBuilder和StringBuffer的默认容量是16
abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ char[] value; /** }
里面是一个char数组,那么数组定好了,长度就不会变了,那么自动扩容是怎么回事?是建一个新数组,将原始数组数据拷贝过来,所以是比较耗内存耗时间的,
所以最好在创建这两个类的对象的时候预测好需要的容量,采用指定容量的方式来创建对象,为了减少数组的拷贝,提高效率。
两者区别
StringBuffer是线程安全的(源码里大多方法都用了synchronized),StringBuilder不是线程安全的