代码之家  ›  专栏  ›  技术社区  ›  Saurav Sahu

字符串串联,然后在循环中追加

  •  2
  • Saurav Sahu  · 技术社区  · 7 年前

    找到了Bruce Eckel写的《Java思考》一书的摘录。

    如果你想走捷径 append(a + ": " + c) ,的 开始制作 更多 对象。

    这是否意味着我们不应该用一行代码来替换一组追加操作 result.append(i + ": " + 2*i + " ")

    StringBuilder result = new StringBuilder();
    for(int i = 0; i < 25; i++) {
        result.append(i);
        result.append(": ");
        result.append(2*i);
        result.append(", ") 
    }
    

    上面的语句对Java8也适用吗?

    answer 就这样:(让我更加困惑)

    在循环中 什么时候 编译器无法替换 StringBuilder本身。

    与首选编码风格相关的任何方面也是受欢迎的。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Peter Lawrey    7 年前

    StringBuilder result = new StringBuilder();
    for (int i = 0; i < 25; i++) {
        result.append(i).append(": ").append(2 * i).append(", ");
    }
    

    注意:IDEs和IntelliJ一样,将检测并提供自动修复,因为这是一个常见的翻译。

        2
  •  2
  •   TiiJ7    7 年前

    基本上,编译器会替换 String 串联 StringBuilder s、 所以你的台词

    result.append(i + ": " + 2*i + " ");
    

    已更改为

    result.append(new StringBuilder().append(i).append(": ").append(2*i).append(" ").toString());
    

    就像你看到的,它只是创造了 另一个 每一个 循环的迭代,导致大量的创建和垃圾回收。

    所以是的,它肯定是更好的只是附加到 字符串拼接 您已经有了直接连接,而不是连接。你是否能用一句流利的台词来表达这一点主要取决于你的喜好。

    字符串拼接

    这对于Java8仍然有效,尽管从那时起有了替代的流方法,就像其他答案中的一个一样。

        3
  •  0
  •   Torben    7 年前

    是的,当性能至关重要时,我们仍然应该使用链式追加,而不是字符串串联。

    然而,当性能不是关键的时候,我们应该努力提高代码的可读性、清晰性和重用性。因此,我的风格选择是:

    IntStream
        .range(0, 25)
        .map(i, String.format("%d: %d", i, i*2)
        .collect(Collectors.joining(", "));
    
    推荐文章