连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?

来源:互联网 发布:bi域名 编辑:程序博客网 时间:2024/04/29 19:13

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的连接为例,具体过程图解如下:


上面过程为我自己琢磨的,如果理解有错,望指证。


原创粉丝点击