2017-10-04 45 views
0

我的下面的方法需要返回从字符串连接的字符串。为什么字符串更适合串联的StringBuilder?

StringBuilder sb = new StringBuilder(); 
sb.append("count: ").append(this.count()).append("\n"); 

return sb.toString(); 

在的IntelliJ,代码检查表明我有一个字符串像下面来取代这个StringBuilder的:

String sb = "count: " + this.count() + "\n"; 
return sb 

我的印象是StringBuilder的应该追加方法一起使用,来代替字符串连接带加号。这种代码检查建议是否在IntelliJ中有意义?

+0

的可能的复制[在Java中的toString()中的StringBuilder vs字符串串联)(https://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java) – Meo

+0

字面上只是使用标题... – Meo

回答

1

你在你的推定,大部分的IntelliJ 检查鼓励你做的事情在一个“更好”的方式是正确的。

但是,情况并非总是如此。特别是在某些检查“双向”工作的情况下 - >您必须对“更好”的情况进行自己的判断。

在这种情况下,如果你以一个正常的连接字符串:

return "count: " + count + "\n"; 

有可用的几个检查 - 把光标放在"count: "并按下Alt-输入:

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

如果选择选项(2),你会得到这样的:

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

现在,你可以再次使用ALT输入选择“与字符串替换StringBuilder的”反向的变化。

在这种情况下,您发现了一个双向检查/重构:它可以双向运行。其他重构(如“封装”)只能以一种方式工作。

至于什么是“更好” - 你必须权衡的StringBuilder与可读性和简单的性能,并作出判断自己 - 的IntelliJ只是提供方便的检查,以帮助你;)

+0

对于侧面的问题标题(在_numerous_其他地方提到:)而不是这个问题:“这个代码检查建议是否合理......?”非常整洁。 – glytching

+0

@ glitch除了它没有真正回答这个问题,因为它没有解释什么时候应该使用StringBuilder,这就是OP令人困惑的原因。 – Meo

+0

Aldo在IntelliJ中对检查的描述清楚地表明:“使用字符串连接可以使代码变得更短更简单,只有当结果串联的效率至少与原始StringBuffer或StringBuilder代码一样高效时,才会报告。” – Meo

相关问题