Java开发笔记(一百五十四)StringBuffer和StringBuilder的由来

本文探讨了Java中String、StringBuffer和StringBuilder的区别。由于String对象的不可变性导致频繁拼接时性能下降,Java引入了StringBuffer以提供可变字符串并优化性能。StringBuffer是线程安全的,而StringBuilder则去除了同步,进一步提升效率。在多线程不涉及的情况下,StringBuilder是最佳选择。实验表明,StringBuilder在大量拼接时性能最优。
摘要由CSDN通过智能技术生成

本来String类已经能够完成字符串操作的所有功能,为何Java又提供了专门的StringBuffer和StringBuilder呢?这要从String类的设计说起了,查看String的源码,发现其内部采用字符数组保存字符串,如下所示:

    private final char value[];

可是问题在于,这个字符数组被final修饰了,意味着数组大小不可改变。若想将现有字符串拼接一段字符形成新串(无论是加号拼接还是调用format方法),String类就无法扩充现有的字符数组,只能重新生成新的String对象。然而在需要频繁拼接字符串的场合,不断地重新生成String对象,这涉及到内存数据的反复销毁和反复分配,无疑对程序性能产生巨大的影响。
为了解决频繁拼接带来的性能问题,一开始Java提供了StringBuffer类,其内部的value数组是大小可变的,在拼接字符串时无需重新生成StringBuffer对象,由此避免了对象创建与对象销毁带来的开销。StringBuffer的拼接方法名叫append,因为该方法同时也返回拼接后的StringBuffer对象,所以拼接多个字符串时只需连续调用append即可。
不过Java把StringBuffer类设计成线程安全,它的append方法被synchronized修饰,表示这是个同步方法。既然是同步方法,那么调用之时就会先加锁,等调用结束再解锁。该设计的意图是让StringBuffer类更加健壮,但是拼接字符串几乎不存在多线程并发的场景,绝大多数情况都是按顺序拼接,谁会脑袋抽筋中途插队拼接呢?于是这个锁同步设计形同鸡肋。
鉴于加解锁也会带来额外的性能损耗,因此JDK1.5又增加了StringB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值