Java StringBuffer和StringBuilder类

目录

何时需要用到StringBuffer和StringBuilder类?

StringBuffer,StringBuilder对String类不同的是?

StringBuffer和StringBuilder适用场景


  • 何时需要用到StringBuffer和StringBuilder类?

当对字符串进行修改的时候。


  • StringBuffer,StringBuilder对String类不同的是?

StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。

String是被final修饰的,他的长度是不可变的,就算调用String的concat方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的String的值赋给新创建的对象,而StringBuffer的长度是可变的,调用StringBuffer的append方法来改变StringBuffer的长度,并且相较于StringBuffer,String一旦发生长度变化,是非常耗内存的。

 StringStringBufferStringBuilder
长度是否可变
线程是否安全 
速度  

 

 


  • StringBuffer和StringBuilder适用场景

Stringbuffer 基本没有适用场景,你应该在所有的情况下选择使用 Stringbuiler,除非你真的遇到了一个需要线程安全的场景。

关于线程安全,即使你真的遇到了这样的场景,很不幸的是,恐怕你仍然有 99.99....99% 的情况下没有必要选择 stringbuffer,因为 stringbuffer 的线程安全,仅仅是保证 jvm 不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。

最后,为什么会有 stringbuffer 的存在,如果真的没有价值,为什么 jdk 会提供这个类?因为最早是没有 stringbuilder 的,sun 的人决定让 stringbuffer 是线程安全的,然后大约 10 年之后,人们终于意识到这是一个多么愚蠢的决定,意识到在这 10 年之中这个愚蠢的决定为 java 运行速度慢这样的流言贡献了多大的力量,于是,在 jdk1.5 的时候,终于决定提供一个非线程安全的 stringbuffer 实现,并命名为 stringbuilder。顺便,javac 好像大概也是从这个版本开始,把所有用加号连接的 string 运算都隐式的改写成 stringbuilder,也就是说,从 jdk1.5 开始,用加号拼接字符串已经没有任何性能损失了。

严格的说,如果没有循环的情况下,单行用加号拼接字符串是没有性能损失的,java 编译器会隐式的替换成 stringbuilder,但在有循环的情况下,编译器没法做到足够智能的替换,仍然会有不必要的性能损耗,因此,用循环拼接字符串的时候,还是老老实实的用 stringbuilder 吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值