答案:
-
可变性和线程安全
- String是字符串常量,它的底层是final修饰的字符数组,
private final char value[],是不可变的,保存在常量池中,所以它天然线程安全,字符串设计成immutable(不可变)是为了字符串共享,缺点就是在编辑字符串的时候效率很低。 - StringBuffer和StringBuilder是字符串变量,它们保存在堆内存中,它们派生自AbstractStringBuiler,都实现了expandCapacity、append、insert、indexOf 等公共方法,但是StringBuffer对方法加了Synchronized同步锁,所以他是线程安全的,而StringBuilder并没有对方法加Synchronized同步锁,所以它不是线程安全的。
- String是字符串常量,它的底层是final修饰的字符数组,
-
如何选用
- 如果不需要频繁的操作字符串选用String
- 多线程情况下大量操作字符串选用StringBuffer
- 单线程情况下大量操作字符串选用StringBuilder
-
升华
- String是在Java 1.0版本引入的,StringBuffer是Java 2.0版本引入的,StringBuilder是Java 5.0版本引入的,可见Java对字符串的处理能力越来越强。
参考回答