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