浅谈String、StringBuffer和StringBuilder

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() 方法?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值