String是Java中很常使用到的字符串类。从源码看,它被设计成了final class,属性value是被final修饰的char数组,具备不可变性,也就是说String对象一旦被创建就不能再被修改,当进行字符串的拼接、截取,都会产生新的String对象
因为String的拼接操作很普遍,频繁创建、销毁对象开销就会比较的大。于是,就有了StringBuffer、StringBuilder类
StringBuffer、StringBuffer可以通过append、add方法对字符串进行末尾追加或者指定位置添加。从源码看,两者都继承自AbstractStringBuilder,AbstractStringBuilder声明了一个可修改的char数组(JDK9以后是byte数组)属性value,也实现了基本操作。两者之间比较大的区别就是StringBuffer的修改数据的方法都加了synchronized关键字,以保证线程安全。
线程安全就会带来一些额外的性能开销,因此除非有线程安全的需要,不然还是使用StringBuilder进行字符串的处理。
内部数组应创建多大?太小,拼接时如果拼接对象更大又要重新创建数组。太大,浪费空间。从源码看,创建对象时默认初始长度capacity是16。如果事先可以预估大小,就可以在创建对象时指定合适的大小,避免多次扩容带来的开销。
扩容的实现逻辑,要抛弃原有数组,创建新的倍数数组,进行ArrayCopy数组拷贝