可变性的区别:
String是字符串常量,是不可变的对象:String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。
线程安全性:
AbstractStringBuilder是StringBulider和StringBuffer的父类,其中定义了很多公共方法。StringBuffer对这些方法加了同步锁,所以是线程安全的,但是StringBuilder没加,所以是线程不安全的;String是不可变的,所以是线程安全的;
性能:
执行速度:StringBuilder (没同步锁,不安全,所以最快)>StringBuffer(有同步锁,安全)>String(不可变性,安全)
原因:
每次对String类型进行改变的时候,都是新生成了一个新的String对象,然后将指针指向新的对象。
StringBuffer是对对象本身进行操作,StringBulider比StringBuffer快10%-15%,但是却冒着多线程不安全的风险;
StringBuilder没有同步锁,所以最快;
单线程下操作字符串缓冲区,选择StringBuilder最快;
多线程下操作字符串缓冲区,选择StringBuffer最好;
如果是少量数据,用String就够了;