string
是 final 的,内部用一个 final 类型的 char 数组存储数据,它的拼接效率比较低,实际上是通过建立一个 StringBuffer,让后台调用 append(),最后再将 StringBuffer toSting(),每次操作 Sting 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的。
StringBuffer
也是 final,线程安全的,中采用一个 char 数组来保存需要 append 的字符串,char 数组有一个初始大小,当 append 的字符串长度超过当前 char 数组容量时,则对 char 数组进行动态扩展,也即重新申请一段更大的内存空间,然后将当前 char 数组拷贝到新的位置,因为重新分配内存并拷贝的开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式,这里是 2 倍。
StringBuilder
线程不安全。