String是一个字符串常量,长度不可改变。
StringBuffer和StringBuilder是字符串变量,长度可以改变。
StringBuffer是线程安全的。
StringBuilder是线程不安全的。
jdk8及之前String底层使用被final修饰的字符数组来保存字符串,private final char[] value,String对象是不可变的,也可以理解为常量,线程安全。
jdk9及之后底层改为了final修饰的字节数组来保存字符串。
总结:
如果操作少量数据,用String。
如果多线程操作大量数据,用StringBuffer。
如果单线程操作大量数据,用StringBuilder。
StringBuffer线程安全是因为它对方法加了同步锁,StringBuilder并没有对方法加同步锁。