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

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


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值