可变性:
String 类中使用 final 关键字修饰字符数组来保存字符串, private final char value[]. 所以是不可变的 ( 注: Java9 之后 String 的实现类改用 byte 数组存储字符串 private final byte[] value)
StringBuffer 和 StringBuilder 都是继承 AbstractStringBuilder 类, 在 AbstractStringBuilder 类中也是用字符数组类 char value[] 保存字符串, 但是没有用 final 关键字修饰, 所以是可变 的.
线程安全性:
String 是不可变的, 线程安全.
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁, 所以是线程安全的.
StringBuilder 并没有对方法进行加同步锁 synchronized 关键字, 所以是线程不安全的.
性能:
每次对 String 对象进行改变, 都会生成新的对象. 然后将指针指向新的 string 对象.
StringBuffer 每次都会对对象本身进行操作, 而不是生成新的对象并改变对象引用. 相同情况下使用 StringBuilder 比使用 StringBuffer 能获得 10%~15% 的性能提升, 但是却要冒着多线程不安全的风险.
来源: http://www.bubuko.com/infodetail-3460596.html