1.可变性与不变性
- String的不变性
通过查看String的源码(private final char value[];),可以知道String类是由final关键字字符数组保存字符串。
对于final关键字来说,无论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变。
所以String对象是不可变的。
- StringBuffer和StringBuilder的可变性
StringBuffer 和 StringBuilder 类的对象能够被多次的修改。StringBuffer和StringBuilder继承AbstractStringBuilder,在AbstractStringBuilder中使用字符数组保存字符串(char[] value;),没有final。
所以这两个对象都是可变的。
2.线程安全性
String中对象不可变,可理解为常量,线程安全。
StringBuffer中的方法添加了同步锁(public synchronized StringBuffer),线程安全。
StringBuilder中的方法无同步锁(public StringBuilder),线程非安全。
3.性能
String类型改变时,会产生一个新的String对象,将指针指向新的String对象
StringBuffer类型改变时,会对对象本身进行操作,不会生成新的对象并改变对象引用
StringBuilder的速度比StringBuffer快,但线程不安全
4.小结
1)操作少量数据-->String
2)单线程操作字符串缓冲区下操作大量数据-->StringBuilder
3)多线程操作字符串缓冲区下操作大量数据-->StringBuffer