字符串连接操作符(+)是将几个字符串组合成一个字符串的方便方法。对于生成单行输出或构造一个小的、固定大小的对象的字符串表示形式,它是可以的,但是它不能伸缩。重复使用字符串串联运算符串联n个字符串需要n的时间二次型。这是字符串不可变这一事实的不幸结果( item17)。当连接两个字符串时,将复制这两个字符串的内容。
字符串连接操作符(+)是将几个字符串组合成一个字符串的方便方法。对于生成单行输出或构造一个小的、固定大小的对象的字符串表示形式,它是可以的,但是它不能伸缩。重复使用字符串串联运算符串联n个字符串需要n的时间二次型。这是字符串不可变这一事实的不幸结果( item17)。当连接两个字符串时,将复制这两个字符串的内容。
如果项的数量很大,则该方法的性能非常糟糕。了达到可接受的性能,使用StringBuilder代替字符串来存储正在构建的语句:
自Java 6以来,为了使字符串连接更快,已经做了大量工作,但是这两种方法的性能差异仍然很大:如果numItems返回100,lineForItem返回一个80个字符的字符串,那么第二个方法在我的机器上运行的速度是第一个方法的6.5倍。由于第一种方法在项目数量上是二次的,而第二种方法是线性的,所以随着项目数量的增加,性能差异会变得越来越大。注意,第二个方法预先分配了一个足够大的StringBuilder来保存整个结果,从而消除了自动增长的需要。即使使用默认大小的StringBuilder对其进行失谐,它仍然比第一个方法快5.5倍。
这个故事的寓意很简单:不要使用字符串连接操作符组合多个字符串除非性能无关紧要。而是使用StringBuilder的append方法,或者,使用字符数组,或者一次处理一个字符串,而不是组合它们。
本文写于2019.7.19,历时1天