【问题标题】:Which one to use- String or StringBuffer in concatenation [duplicate]使用哪一个 - 串联中的 String 或 StringBuffer [重复]
【发布时间】:2014-07-09 18:14:59
【问题描述】:

我在我的项目中看到了java代码,它根据各种参数构造了一个文件名。java代码是这样的

String file = null;
String fileDirSeperator = System.getProperty("file.separator");
String pwd = System.getProperty("user.dir");
file = pwd + fileDirSeperator + "properties" + fileDirSeperator + folder_name + file_name;

我想知道我是否应该StringBuffer 而不是String。我知道将任何内容附加到 String 会创建新对象,所以我想我应该 StringBuffer

我可以知道你的建议吗?

还有,

 file = pwd + fileDirSeperator + "properties" + fileDirSeperator + folder_name + file_name;

在上面的文件名构造中,会创建6个对象(每个变量一个)?

【问题讨论】:

  • 如果你只连接 6 个字符串,我不会太在意性能。使用+,不要过度复杂化。
  • @BobbyDigital 不适用于这种情况。生成的字节码已经为你使用了StringBuilder
  • @LuiggiMendoza:我看到了!
  • 真的,您唯一需要关注与+ 的字符串连接是在循环/递归调用/等中,特别是如果您将结果保存到临时变量中。对于这样一次性的事情,您最终将编写与编译器生成的代码相同的代码。

标签: java string object stringbuffer


【解决方案1】:

这无关紧要。除非您在循环中执行此操作,否则您会运行数千次,否则性能并不重要。 String 连接语法将是最直接的。

当性能是串联的问题时,使用StringBuilder

【讨论】:

    【解决方案2】:

    使用StringBuilder 代替您提到的选项。

    当然有这么小的用例,这并不重要

    【讨论】:

    • -1:在这种情况下,编译器将为您使用StringBuilder。检查生成的字节码。仅在通过循环连接时使用StringBuilder,此时编译器无法进行任何代码优化。
    • @LuiggiMendoza 你能指点参考吗?
    • @LuiggiMendoza 说真的,不开玩笑,复制并不难!!!我在问您是否有任何权威链接可以指向解释该选择的原因。顺便谢谢你的-1 :)
    • 复制时间不到 5 分钟。无论如何,这是一个链接:stackoverflow.com/q/47605/1065197
    • @LuiggiMendoza 我会说复制需要不到 2 次,但正如我解释的那样,这不是我的问题。感谢您的链接:)。顺便说一句,并不是每个人都有为这种简单的用例读取字节码或反编译类文件的习惯:)
    【解决方案3】:

    在数以万计的操作中对此进行了基准测试,您不妨使用字符串连接。从 Java 6 开始,性能有了很大提高。

    http://www.javacodegeeks.com/2013/03/java-stringbuilder-myth-debunked.html

    http://www.code-thrill.com/2012/08/stringbuilder-optimizations-demystified.html

    【讨论】:

    • 您的两个链接都表明最好使用 StringBuilder。链接很好,但您的回答与它们相矛盾。什么给了?
    • 我应该指出,即使文章说使用 StringBuilder,第一个说这样做是因为 JDK5,第二个指出使用 if 语句或 for 构造字符串时使用 StringBuilder 的原因循环。发帖人使用字符串的方式应该坚持串联
    猜你喜欢
    • 2012-07-01
    • 2013-11-28
    • 2016-05-12
    • 2012-09-09
    • 2013-07-27
    • 2012-02-18
    • 2014-08-18
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多