可变性:
String类中保存字符串的value数组是用final关键字修饰的,String对象是不可变的
StringBuilder和StringBuffer对象都是继承AbstractStringBuilder类,其中保存字符串的数组没有final修饰所以这两种对象都是可变的
线程安全性:
String对象不可变看作常量所以是线程安全
StringBuffer和StringBuilder可以调用父类提供的一些对于字符串操作的方法,有append、insert、indexof、expandCapacity等共享方法,前者对各种方法进行了加同步锁,所以线程安全,后者没有则不安全
性能:
String类进行使用时都会生成一个新的String对象然后将指针指向新的String对象
StringBuffer和StringBuilder都是对对象本身进行操作,不改变对象的引用,但考虑到线程安全,性能上前者没有后者高,后者高10%-15%左右的性能。
一般我们使用这三个类时,操作少量数据时用String,单线程操作大量数据时用StringBuilder,多线程大数据时使用StringBuffer