【问题标题】:String literal in for loop vs stringbuilder in for loopfor循环中的字符串文字与for循环中的stringbuilder
【发布时间】:2016-09-02 12:19:50
【问题描述】:

我有一个问题。

当我们这样做时

字符串 str = "abc";

"abc" 将成为字符串字面量并驻留在字符串池下。

如果我们在 for 循环中有字符串,如下所示:

private static void doByString() {
        String str;
        for(long l = 0; l < Long.MAX_VALUE; l++){
            str = str + "" + l;
        }
    }

它会产生很多字符串文字,我们必须在 for 循环中使用它。

在这种情况下,我们可以做些什么来尽量减少字符串字面量的产生吗?

在这种情况下我们可以使用字符串生成器吗:

private static void boByStringBuilder() {
        StringBuilder builder = new StringBuilder();
        for(long l = 0; l < Long.MAX_VALUE; l++){
            builder.append(l + "");
        }
    }

【问题讨论】:

  • 是的,这是 StringBuilder 的目的之一。
  • 类似问题:here 和 here。
  • 长话短说,是的,只要连接有任何逻辑阻止编译器用StringBuilder 隐式替换String 连接,就使用StringBuilder,例如在你的循环中。
  • 这两个循环在功能上是不同的。第一个等价于String str = "" + (Long.MAX_VALUE - 1);(这里没有附加——你也可以只做最后的执行)。

标签: java string


【解决方案1】:

它会产生很多字符串文字,我们必须在 for 循环中使用它。

这不会创建任何字符串文字。它将创建字符串。

在这种情况下,我们可以做些什么来尽量减少字符串字面量的产生吗?

不需要,因为它不会创建任何东西。

在这种情况下我们可以使用字符串生成器吗

两个代码都使用 StringBuilder。第一个示例隐式使用 StringBuilder。

注意:

builder.append(l + "");

与

相同
builder.append(new StringBuilder().append(l).append("").toString());

你可以写

private static void boByStringBuilder() {
    StringBuilder builder = new StringBuilder();
    for(long l = 0; l < BIG_NUMBER; l++) {
        builder.append(l); // less Strings
    }
}

【讨论】:

    【解决方案2】:

    for循环内不需要每次都追加空字符串,将追加语句改为

    private static void boByStringBuilder() {
        StringBuilder builder = new StringBuilder();
        for(long l = 0; l < Long.MAX_VALUE; l++){
            builder.append(l);
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 2022-11-17
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多