大家都知道,StringBuilder和StringBuffer主要区别是前者不是线程安全的,后者是线程安全的,余JDK预留的对外接口几乎是一模一样的,所以在确定线程安全的环境的前提下,优先使用SringBuilder,肯定不相同条件下的StringBuffer性能要高,因为那维护同步数据的正确性肯定要消耗资源的。
然而在今天的事业部代码质量报告会上,我在讲解StringBuilder和StirngBuffer的区别以及为什么优于“+”拼接字符串时候,一位经验丰富的前辈指点了一下说StringBuilder尽管在拼接字符串时效率高于StringBuffer,但是最终还是好转成String类型的,而在大字符串拼接的情况下StringBuffer的toString()要比StringBuilder的toString()执行速度将近快3.5倍,所以线程安全的情况下还是用StringBuffer,当时听了很是高心,因为自己不知道这个地方,又涨姿势了。
晚上自己想一探究竟,看了2个类的重写toString()方法的源码除了加了同步锁之外,都是return New String(value,offset,count),纳了闷了,都是底层都是调用的同一个方法,反而怎么是同步的StringBuffer效率高呢,不行,自己写了一个测试程序,来单独验证一下2个toString的效率:
package StringBuilder