Efftive Java第51条: 当心字符串连接的性能,当连接n个字符串而重复地使用字符串连接操作,需要n的平方级的时间。
原因:字符串不可变,所以当两个字符串被连接在一起时,它们的内容都需要拷贝。
结论:当需要做多个字符串连接操作时,为了提高性能,应该使用StringBuilder的append方法,如果没有同步(单线程)问题也可以用StringBuffer类的append方法。
问题:为什么为连接n个字符串而重复的使用+,需要n的平方级别的时间?
证明:
第一次 a1+a2
拷贝次数 1 1
a1a2=a1+a2 共计1+1+1=3次
第二次 a1a2 + a3
拷贝次数 2 1
a1a2a3 = a1+a2+a3 共计 1+2+2*1+1=6次
第三次 a1a2a3 + a4
拷贝次数 3 1
a1a2a3 = a1+a2+a3 共计1+2+3+3*1+1=10次
依此类推
第n次 a1a2...a(n-1) + a(n)
拷贝次数 n-1 1
a1a2...a(n-1)a(n) 共计 1+2+3+(n-1)+1 = 1+2+3+(n-1)+n = n*(n+1)/2
以a1+a2+a3的连接为例,具体过程图解如下:
上面过程为我自己琢磨的,如果理解有错,望指证。