简述
- 相同点:
1.都可以用来操作字符串
2.都使用字符数组保存字符串
3.都是final类型的 - 不同点:
1.对象是否可变:String对象不可变,StringBuffer/StringBuilder对象是可变的
2.线程是否安全:String/StringBuffer是线程安全的,StringBuilder是非线程安全的
上边说的很多人都清楚,面试宝典上也有的说,但为什么可变为什么不可变?线程的安全与否?估计有部分人还是不清楚的吧,下边就说一说
详解
- 可变不可变
虽然上边三个都是final类型的,但是用来保存字符串的字符数组的修饰符却是不一样的,因此结局也就不一样了
1.String类中:如下所示,String类被"final"修饰,所以String对象是不可变的
private final char value[];
2.StringBuilder和StringBuffer:
char[] value - 是否线程安全
1.String对象是不可变的,相当于常量,所以是线程安全的。
2.StringBuffer对方法加了同步锁,所以是线程安全的。
3.StringBuilder没有对方法加同步锁,所以是非线程安全的。 - 如果不考虑线程,StringBuilder效率高于StringBuffer。