String

是常量字符串(final类,值不变,改变的是指向的内存地址)
缺点:频繁拼接字符串非常耗内存

StringBulider,StringBuffer

值是可以改变的,长度可变,底层已数组形式实现。
同时实现Serializable,证明可序列化。
同时实现CharSequence,证明是有序字符集合。可以替代string
StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
由于完全等价,所以都继承AbstractStringBuilder。
无参初始化,长度为16,有参初始化是参数长度+16。
扩容时是对象当前长度*2+2
每次append的时候,最下层执行的System.arraycopy这个方法进行数组的添加。
StringBuffer 始于 JDK 1.0
StringBuilder 始于 JDK 1.5
从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是 StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。如果是直接的字符串的拼接,会直接指向拼接后的字符串常量。