第63项:注意字符串拼接的性能

  字符串拼接操作符(+,string concatenation operator)是把多个字符串组合为一个字符串的便利途径。产生单独一行的输出,或者构造一个字符串来表示一个较小的、大小固定的对象,使用字符串拼接操作符是非常好的,但它不能缩放(but it does not scale)。重复地使用字符串拼接操作符来拼接n个字符串,需要n的平方级的时间 【意思是时间复杂度为n^2 ?】。由于字符串是不可变的导致了这一令人遗憾的结果( This is an unfortunate consequence of the fact that strings are immutable )(第17项)。当两个字符串被拼接在一起的时候,它们的内容都要被拷贝。

  例如,考虑下面的方法,它通过反复拼接每个item行,构造出一个代表statement的字符串。代码如下:

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

  如果item数量巨大,这个方法的执行实践就难以估算。为了获得可以接受的性能,请使用StringBuilder代替String ,来存储建造中的statement:

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

  自Java 6以来,为了使字符串拼接更快已经做了很多工作了,但两种方法的性能差异仍然是巨大的:如果numItems返回100,并且lineForItem返回一个固定长度为80个字符的字符串,在我的机器上,第二种做法比第一种做法要块6.5倍。因为第一种做法的开销随item数量而呈平方级增加,第二种做法则是线性增加,所以,item的数目越大,性能的差别会越显著。注意,第二种做法预先分配了一个足够大的StringBuilder来保存整个结果,即使使用了默认大小的StringBuilder,它仍然比第一种方法快5.5倍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值