1.可变性: String对象是字符串常量,一旦建立就不可更改直至销毁。 而StringBuffer和StringBuilder对象都是可变字符数组。
原因在于:String类中使用final关键字来修饰字符数组,而另外两个继承AbstractStringBuilder类,这个类并没有用final修饰。
2.线程安全性: String对象是常量,线程安全。 StringBuffer对方法加了同步锁synchronized,也是线程安全的。 StringBuilder并没有对方法加同步锁,所以是非线程安全的。
3.性能: String:每次对String类型对象进行改变时都是新建了一个String对象,再将指针指向新String对象。 StringBuffer:每次改变直接对原StringBuffer对象进行操作,而不是生成新对象。 StringBuilder:同样对原对象操作,相比起来只能获得10-15%的性能提升,但要冒着多线程不安全的风险。
总结: 操作少量数据:String 单线程操作大量数据:StringBuilder 多线程操作大量数据:StringBuffer