String,StringBuffer,StringBuilder

本文探讨了在Java中处理字符串的最佳实践。重点介绍了String、StringBuffer和StringBuilder的区别,并通过实验对比了不同字符串连接方式的性能差异。文章建议在单线程环境中使用StringBuilder提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String是不可变类,jvm针对常用类通常都会有优化,譬如针对String就有String Pool的说法。
在进行字符串连接操作时,造成不要使用"+",而应用用StringBuffer来代替,当然,如果连接很少,用"+"代替也无伤大雅。
曾经做过测试,进行10000次"+"操作和和StringBuffer.append操作,二者的的耗时几乎不是一个数量级的。
通常可能前者耗时是几百几千ms而后者所耗时可能为0ms.
我将测试次数上升至10000 * 10的时候,前者通常要几分钟甚至数十分钟,而后者一般能很快完成。
为什么会产生这样的差异?
可以想一下,String是不可变类,那么每一次连接都会产生一个新的对象。
像我上面那样万次十万次的操作,那相当于产生了十万个对象。这样即使不考虑效率,
从内存开销来讲也是极不可取的。

 

在Jdk5.0中,增加了一个StringBuilder类,这个类和StringBuffer是一样的,唯一的区别是StringBuffer是线程安全的,StringBuilder不是线程安全的。
比较二者的差别,写一个小的程序测试一下即可,2个线程同时访问即可看出问题。
测试结果一般是StringBuffer会产生正确的结果,StringBuilder会出现异常(有时候出现OutofMemoryException)或者结果错误。

由于StringBuffer进行了线程同步,所以在单线程环境下,StringBuilder的效率自然比StringBuffer要好一些。
在多线程环境下,使用StringBuffer,否则极力推荐使用StringBuilder。

比如,在一些工具类,局部变量,都可以使用StringBuilder,因为局部变量根本就不会涉及到并发访问的问题。
一般的,除非使用StringBuffer作为类变量或者实例变量,都推荐使用StringBuilder。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值