第51条 当心字符串连接性能
20150702 星期四 北京
字符串连接操作符(+),把多个字符串合并成一个字符串的便利方式.
想要产生单独一行的输出,或者构造一个字符串表示较小的大小固定的对象,那么使用连接操作符非常合适.
不适合运用在大规模场景,为连接n个字符串而重复使用字符串操作符,需要n的平方级的时间.因为字符串不可变导致,当两个字符串拼接在一起,它们的内容都要拷贝.
案例:反复拼接账单行,构造出代表该账单的字符串.
<script src="https://code.youkuaiyun.com/snippets/730335.js"></script>如果账单条数巨大,此方法执行时间不可估量.
为获取可接受的性能,使用StringBuilder代替String.
<script src="https://code.youkuaiyun.com/snippets/730337.js"></script>(以后需要经常使用StringBuilder代替String)
上面两者性能差距非常大,如果numItems()返回100,lineForItem()返回固定长度80个字符的字符串,作者机器上第二种比第一种快85倍.
第一种做法的开销随项目数量呈现平方级别增加;
第二种做法则是线性增加,所以项目越大,性能越明显.
第二种做法预先分配StringBuilder,让它足以容纳结果字符串.
结论:不要使用字符串连接操作符进行拼接多个字符串,除非性能无关紧要,要使用StringBuilder的append()方法;或者使用字符串组,或者每次只处理一个字符串,而不是将它们组合起来.