首页 文章

何时在Java中使用StringBuilder [重复]

提问于
浏览
308

这个问题在这里已有答案:

通常最好在Java中使用 StringBuilder 进行字符串连接 . 总是这样吗?

我的意思是这样的:创建 StringBuilder 对象的开销,调用 append() 方法,最后 toString() 已经小了,然后将现有字符串与 + 运算符连接为两个字符串,或者仅建议更多(超过两个)字符串?

如果有这样的阈值,它依赖于什么(可能是字符串长度,但以哪种方式)?

最后,在较小的情况下,如两个,三个或四个字符串,您是否会交换 + 串联的可读性和简洁性以表现_1789857?

明确使用 StringBuilder 进行常规连接在obsolete Java optimization tips以及Java urban myths被提及为过时 .

9 回答

  • 4

    如果你在循环中使用字符串连接,这样的话,

    String s = "";
    for (int i = 0; i < 100; i++) {
        s += ", " + i;
    }
    

    然后你应该使用 StringBuilder (而不是 StringBuffer )而不是 String ,因为它更快,消耗更少的内存 .

    如果你有一个声明,

    String s = "1, " + "2, " + "3, " + "4, " ...;
    

    然后你可以使用 String ,因为编译器会自动使用 StringBuilder .

  • 2

    拉尔夫的答案非常棒 . 我宁愿使用StringBuilder类来构建/装饰String,因为它的使用更像是Builder模式 .

    public String decorateTheString(String orgStr){
                StringBuilder builder = new StringBuilder();
                builder.append(orgStr);
                builder.deleteCharAt(orgStr.length()-1);
                builder.insert(0,builder.hashCode());
                return builder.toString();
    }
    

    它可以用作帮助器/构建器来构建String,而不是String本身 .

  • 4

    作为一般规则,始终使用更易读的代码,并且只有在性能成为问题时才重构 . 在这种特定情况下,最新的JDK实际上将在任何情况下将代码优化为StringBuilder版本 .

    如果您在循环中或在编译器无法轻松优化的某些复杂代码中进行字符串连接,通常只需要手动执行此操作 .

  • 3

    看看:http://www.javaspecialists.eu/archive/Issue068.htmlhttp://www.javaspecialists.eu/archive/Issue105.html

    在您的环境中执行相同的测试,并检查更新的JDK或Java实现是否使用 String 更好地执行某种类型的字符串操作,或使用 StringBuilder 更好 .

  • 48

    某些编译器可能无法用StringBuilder等效替换任何字符串连接 . 在依赖编译时优化之前,请务必考虑源代码将使用哪些编译器 .

  • 34

    操作员在内部使用 public String concat(String str) . 此方法复制两个字符串的字符,因此它具有与两个字符串的长度成比例的内存要求和运行时复杂性 . StringBuilder工作效率更高 .

    但是我已经读过here,使用operater的连接代码在后Java 4编译器上更改为StringBuilder . 所以这可能不是一个问题 . (虽然如果我在代码中依赖它,我会真的检查这句话!)

  • 434

    对于两个字符串,concat更快,在其他情况下StringBuilder是更好的选择,请参阅concatenation operator (+) vs concat()中的解释

  • 5

    字符串连接的问题在于它会导致使用所有相关成本复制String对象 . StringBuilder不是线程安全的,因此比StringBuffer更快,而StringBuffer曾经是Java 5之前的首选 . 根据经验,你不应该在循环中进行字符串连接,这将经常被调用 . 我想在这里做几个连接,只要你不谈论数百个就不会伤害你,这当然取决于你的性能要求 . 如果你正在做实时的东西,你应该非常小心 .

  • 7

    Microsoft认证材料解决了同样的问题 . 在.NET世界中,StringBuilder对象的开销使得2个String对象的简单连接更加高效 . 我会假设Java字符串的类似答案 .

相关问题