美文网首页
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: 注意字符串拼接的性能问题

    ITEM 63: BEWARE THE PERFORMANCE OF STRING CONCATENATION  ...

  • go语言string之Buffer与Builder

    操作字符串离不开字符串的拼接,但是Go中string是只读类型,大量字符串的拼接会造成性能问题。 字符串拼接的方式...

  • 日志、字符串拼接

    关于字符串拼接效率: 单词调用字符串拼接性能 + > strings.Join > bytes.Buffer > ...

  • 字符串

    一、字符串格式化 String.format()的使用 二、字符串拼接 字符串拼接性能比较 三、日志打印效率 使用...

  • C# string 拼接操作性能测试

    一、C# 拼接字符串的几种方式和性能 对于少量固定的字符串拼接,如string s= "a" + "b" + "c...

  • 字符串、数组拼接注意事项

    字符串、数组拼接注意事项 字符串拼接2种方法 - (NSString *)stringByAppendingStr...

  • 同事如此使用StringBuilder,我给他提了一个Bug

    字符串的拼接在项目中使用的非常频繁,但稍不留意往往又会造成一些性能问题。 字符串的拼接在项目中使用的非常频繁,但稍...

  • StringBuilder性能优化

    在String字符串拼接性能优化博客中我已经介绍过了String "+" 拼接背后的StringBuilder实现...

  • 关于字符串

    字符串有不可变的特点,这样会带来一个问题:当我们大量拼接字符串时,会有性能问题。 字符方法:1、字符方法 2、截取...

  • Java字符串拼接性能问题

    问题:如下2个方法 fun1 和 fun2,都是在做同样的事情,手动拼接15000个A,哪个效率高? 有编程经验的...

网友评论

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

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