【笔记63】当心字符串连接引起的性能问题

字符串连接操作符(+)是把多个字符串合并为一个字符串的便利途径,但是它不适合运用在大规模的场景中。

为连接n个字符串而重复使用字符串连接操作符,需要n的平方级的时间。这是由于字符串不可变所致,当两个字符串被连接在一起时,他们的内容都要被拷贝。

考虑下面的方法,它通过反复连接每个项目行,构造出一个代表该对账单的字符串。

// Inappropriate use of string concatenation -Performs horribly!
public String statement(){
  String result = "";
  for(int i = 0; i < numItem();i++){
    result += lineForItem(i);//String concatenation
  }
  return result;
}

如果项目数量巨大,这个方法的执行时间就难以估算。为了获得可以接受的性能,请使用StringBuilder代替String,来存储建造中的对账单。(Java 1.5发行版本中增加了非同步StringBuilder类,代替现在已经过时的StringBuffer类。):

public String statement(){
  StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
  for(int i = 0; i < numItem(); i++){
    b.append(lineForItem(i));
  }
  return b.toString();
}

上述的两种做法性能差别非常大。如果numItem返回100,并且lineForItem返回一个固定长度为80个字符的字符串,第二种做法比第一种做法要快85倍。因为第一种做法开销随项目数量而呈平方级增加,第二种做法则是线性增加,所以项目数越大,性能差别会越明显。注意,第二种做法预先分配了一个StringBuilder,使它大到足以容纳结果的字符串。即使因为预先不知道字符串长度,使用默认大小的StringBuilder,它仍然比第一种快50倍。

  原则很简单:不要使用字符串连接操作符来合并多个字符串,除非性能无关紧要。相反,应该使用StringBuilder的append方法。另一种方法是,使用字符数组,或者每次只处理一个字符串,而不是将它们组合起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值