美文网首页
ITEM 63: 注意字符串拼接的性能问题

ITEM 63: 注意字符串拼接的性能问题

作者: rabbittttt | 来源:发表于2020-01-27 14:18 被阅读0次

    ITEM 63: BEWARE THE PERFORMANCE OF STRING CONCATENATION
      字符串连接操作符(+)是将几个字符串组合成一个字符串的方便方法。对于生成单行输出或者构造一个小的、固定大小的对象的字符串表示形式,它是可以的,但是它不能伸缩。重复使用字符串连接操作符来连接n个字符串需要n的时间平方。这是字符串是不可变的这一事实的不幸后果(item 17)。当两个字符串连接在一起时,将复制它们的内容。
      例如,考虑这个方法,它通过重复连接每个项目的行来构造账单语句的字符串表示:

    // 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;
    }
    

      如果项的数量很大,则该方法执行得非常糟糕。为了获得可接受的性能,我们应该使用StringBuilder 代替字符串来存储正在构建的语句:

    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 倍。由于第一种方法是项目数量的二次型,而第二种方法是线性的,所以随着项目数量的增加,性能差异会越来越大。注意,第二个方法预先分配了一个足够大的 StringBuilder 来容纳整个结果,从而消除了自动增长的需要。即使使用默认大小的 StringBuilder 进行初始化,它仍然比第一个方法快5.5倍。
      本节很简单:除非性能无关紧要,否则不要使用字符串连接操作符组合多个字符串。而是使用 StringBuilder 的 append 方法。或者,使用字符数组,或者一次处理一个字符串,而不是组合它们。

    相关文章

      网友评论

          本文标题:ITEM 63: 注意字符串拼接的性能问题

          本文链接:https://www.haomeiwen.com/subject/qrcethtx.html