【问题标题】:Most efficient way to append a constant string to a variable string in Java?在Java中将常量字符串附加到变量字符串的最有效方法?
【发布时间】:2012-05-01 18:46:24
【问题描述】:

目前在我的代码中,我在 for 循环中有一些类似于:

bstr = bstr + x.charAt(i) + x.charAt(i>>4) + x.charAt(i>>8);

其中 i 是一个整数和循环变量,x 是一个静态的最终常量字符串。 bstr 可以是 KB 的顺序。

谢谢

【问题讨论】:

    标签: java string loops concatenation


    【解决方案1】:

    执行此操作的一种有效方法是使用 StringBuilder 连接您的字符串:

    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < count; i++){
        builder.append(x.charAt(i));
        builder.append(x.charAt(i>>4));
        builder.append(x.charAt(i>>8));
    }
    
    return builder.toString();
    

    这种技术避免了在 for 循环的连接之间存储所有字符串副本的问题。

    编辑:

    或者这对你有用吗(一次不添加一个字符):

    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < count; i++){
        builder.append(x);
    }
    
    return builder.toString();
    

    【讨论】:

    • 你所说的“所有连接的组合”是什么意思? a + b + c 等表达式编译为 new StringBuilder().append(a).append(b).append(c).toString()
    • 使用StringBuilder 是实现此目的的好方法。但是,从 Java 5 开始,编译器可能会自动将连接转换为使用 StringBuilder:java.sun.com/developer/technicalArticles/Interviews/community/…
    • 如问题所述,JVM 不会在 for 循环中转换串联。
    • 所以,是的,for 循环的内容将被正确连接,但在迭代中,连接仍将存储每个迭代副本。
    【解决方案2】:

    在循环之前创建一个StringBuilder 并重用它:

    StringBuilder sb = new StringBuilder();
    
    while (someCondition) {
        ...
        sb.append(x.charAt(i))
          .append(x.charAt(i >> 4))
          .append(x.charAt(i >> 8));
        ...
    }
    
    bstr = sb.toString();
    

    【讨论】:

      【解决方案3】:

      使用 StringBuilder 并在循环时追加。

      StringBuilder sb = new StringBuilder();
      sb.append(bstr);
      for(int i=0; i < somecondition; i++){
        sb.append(x.charAt(i)).append(x.charAt(i>>4)).append(x.charAt(i>>8));  
      }
      System.out.println(sb.toString());
      

      【讨论】:

        【解决方案4】:

        一种选择是使用StringBuilder 类。它有一个内部 char 数组,它会将您的内容附加到该数组中,直到您调用 toString 方法,此时它会创建一个新的 String 对象。当然,由于它使用一个数组来存储你的字符,它可能会用完空间,此时它会将内容复制到一个新的更大的数组中。你可以通过最初给它一个足够大的容量来容纳最终的字符串来避免这种情况。

        // Create a new StringBuilder with an initial capacity that is a little larger than the final String
        StringBuilder builder = new StringBuilder(estimatedSizeOfFinalString);
        int i = 0;
        while (loopConditionIsTrue) {
            builder.append(x.charAt(i)).append(x.charAt(i >> 4)).append(x.charAt(i >> 8);
        }
        String bstr = builder.toString();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-09
          • 1970-01-01
          • 2016-07-14
          • 1970-01-01
          • 2022-01-26
          • 2012-02-23
          • 1970-01-01
          相关资源
          最近更新 更多