为什么在字符串连接时使用String比StringBuilder更可取?

4
我的下面的方法需要返回一个由多个字符串拼接而成的字符串。
StringBuilder sb = new StringBuilder();
sb.append("count: ").append(this.count()).append( "\n");

return sb.toString();

在IntelliJ中,代码检查建议我将这个StringBuilder替换为下面这样的一个String:
String sb = "count: " + this.count() + "\n";
return sb

我的印象是应该使用StringBuilder的append方法,以替换加号的字符串连接。 这个IntelliJ代码检查建议有意义吗?

只是字面上地在谷歌搜索了标题... - Meo
1个回答

7
您的想法是正确的,大多数IntelliJ 检查都会鼓励您用更好的方式编写代码。
然而,并非总是如此。特别是当一些检查“双向”工作时,您需要行使自己的判断来确定哪种方式更好。
在这种情况下,如果您从普通的连接字符串开始:
    return "count: " + count + "\n";

有几个检查可用 - 将光标放在 "count: " 上并按 alt-enter:

  1. 使用 String.format() 替换 '+'
  2. 使用 StringBuilder.append() 替换 '+'
  3. 使用 java.text.MessageFormat.format() 替换 '+'

如果您选择选项 (2),则会得到以下结果:

    return new StringBuilder().append("count: ").append(count).append("\n").toString();

现在,你可以再次使用alt-enter来选择“用String替换StringBuilder”以撤销更改。
在这种情况下,你发现了一个双向的检查/重构:它可以双向工作。其他重构(比如“Encapsulate”)只能单向工作。
至于什么是“更好”的 - 你需要权衡`StringBuilder`的性能与可读性和简洁性,然后自己做出判断 - IntelliJ只是提供方便的检查来帮助你 ;)

1
非常好,你回避了问题标题(在许多其他地方已经解决了 :)),而是很好地解决了这个方面的问题:“这个代码检查建议是否有意义...?” - glytching
@glitch除了没有解释应该何时使用StringBuilder,这也是OP困惑的原因,它实际上并没有回答问题。 - Meo
尽管IntelliJ中的检查描述清楚地说明“使用字符串连接使代码更短、更简单。当生成的连接至少与原始StringBuffer或StringBuilder代码一样有效或更有效时,此检查仅报告。” - Meo
@Meo,性能影响在这里有解释:https://dev59.com/JnI_5IYBdhLWcg3wFu_L - vikingsteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接