• 当心字符串的连接性能


    当心字符串的连接性能

    字符串连接操作符(+)是把多个字符串合并为一个字符串的便利途径。要想产生单独一行的输出,或者构建一个字符串来表示一个较小的、大小固定的对象,使用连接符操作符是非常合适的,但是它不适合运用在大规模的场景中。未连接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方法。另一种方法是,使用字符数组,或者每次只处理一个字符串,而不是将它们组合起来。

  • 相关阅读:
    ComboBox中Tag的使用,转换为Enum类型
    datagridview定时分页(翻页)
    DataGridView导出excel/xml
    Log4net学习笔记及部分使用方法
    C#中Abstract 与 Virtual
    The project type is not supported by this installation?
    全国哀悼日 网站变灰装(附代码)
    设计出好的对象模式
    不仅拥有XmlDocument一样简单的XML操作方法,并且实现数据文件安全存储功能——XmlEDocument
    Remoting模仿QQ实现客户端,服务器端聊天功能
  • 原文地址:https://www.cnblogs.com/mr-cc/p/5824867.html
Copyright © 2020-2023  润新知