可变性
String类中使用final关键字的数组(根据版本有所区分,JDK8及以前用char数组,之后用byte数组)来保存字符串,所以String对象是不可变的。
StringBuffer和StringBuilder都继承了AbstractStringBuilder类,在AbstractStringBuilder中也是使用数组来保存字符串,但是没有用final修饰所以这两种对象都是可变的。
线程安全性
String中的对象是不可变的,也就可以理解为常量,是线程安全的。
StringBuffer对方法都加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法加同步锁,所以是非线程安全的。
性能
每次对String类型进行改变的时候,都会生成新的String对象,并改变对象引用
StringBuffer和StirngBuilder每次都会对对象本身进行操作,而不是生成新的对象。而相同情况下,使用StringBuilder相比使用StringBuffer仅能获得10% ~ 15%左右的性能提升,但是是非线程安全的。
使用场景
操作少量字符串:String
单线程操作大量字符串:StringBuilder
多线程操作大量数据:StringBuffer