1.String、StringBuffer和StringBuilder的可变性
1.1String
String是一种引用类型,底层用char数组实现(Java9之前),其是一种不可变类,一旦被创建,就不能修改它的值(被final所修饰,无法被继承、修改);
1.2StringBuffer、StringBuilder
两者都是用于字符串操作的字符串缓冲区,继承自 AbstractStringBuilder 类,使用字符数组保存字符串,是可变类,提供着操作字符串的方法(如append、insert等 )。
2.线程安全性
2.1String
由于上述String的可变性可以看出,他的内容是不可被修改的,所以其线程是安全的。
2.2StringBuffer
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
2.3StringBuilder
StringBuilder 并没有对方法加同步锁,所以是线程非安全的。
3.性能分析使用三者的场景
从性能上来说,三者的性能如下:
StringBuilder>StringBuffer>String
所以,各自适用场景一般来说,
操作少量的数据: 适用 String
单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer
(摘自https://javaguide.cn)
4.拓展问题
4.1String为何需要被设计成不可变类?
https://blog.csdn.net/weixin_43139183/article/details/121119389
4.2String中使用“+”的字符串拼接方式是否线程安全?
此问题是根据“String中的“+” StringBuilder 调用 append() 方法实现,拼接完成之后调用 toString() 得到一个 String 对象”这一知识点拓展而来的。由此我们推断“+”字符进行拼接可能存在线程安全问题。
详细可参考:
https://www.javacoder.cn/?p=310
思考:为何String使用“+”拼接字符串常量效率却高于StringBuilder使用append() 方法?