String、StringBuilder、StringBuffer的四大区别解析

面试官问:String、StringBuilder、StringBuffer有什么区别么?

这个问题是个高频问题,所以今天从源码上进行深度刨析他们的区别。

如何回答:

从四个点出发:

1、可变/不可变类

String是不可变类。他被被final修饰,所以每一次的创建修改删除都要重新分配内存创建新的对象。

StringBuilder和StringBuffer是可变类,修改以及追加都不会创建新的对象。

2、线程安全性

String被final修饰是线程安全的

StringBuffer使用了同步锁是线程安全的

StringBuilder是线程不安全的

3、存储位置

String存储在字符串常量池中

StringBuilder和StringBuffer存放在堆中。

4、效率上

String < StringBuffer < StringBuilder


区别:

StringStringBuilderStringBuffer
执行速度最差最高其次
线程安全线程安全线程不安全线程安全
使用场景少量字符串操作多线程环境下的大量操作单线程环境下的大量操作

 

从上面表格可以得出的三者区别结论,下面我们分别分析下:

String 

String是把数据存放在了字符串常量池中,所有的String都是常量的方式来保存的,并且它是被final修饰的所以是线程安全的。每一个String对象在被创建好后就不会再发生任何改变,如果进行值的重新指向,会在池中寻找或者创建一个新的对象。

他是支持查找不支持修改的,所以执行效率最低。

适合使用在少量字符串操作的情况下。

 StringBuilder

StringBuilder是执行效率最高的,底层和StringBuffer一样通过char[]数组来实现,支持查询修改操作,效率高但是不安全

不安全:

在进行多线程处理的时候,多个线程对同一个变量进行修改查询操作的时候会出现数据的混乱,执行错误逻辑,它没有对线程安全进行考虑,是线程不安全的

适合使用在单线程大象字符串操作情况下。

StringBuffer

StringBuffer效率虽然没有StringBuilder高,但是比String效率高的多。

效率低的原因:

在考虑线程安全的情况下,在进行字符串操作的时候使用了 synchronized 关键字的进行加锁操作来保证线程的安全性。

适合使用在多线程对多字符串操作的情况下。

在回答这个问题的适合从总结出发,重心放在线程安全的角度出发,如果要继续深入的话要从加锁往下深入。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极品小學生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值