【问题标题】:Why does IntelliJ wants me to change this?为什么 IntelliJ 要我改变这个?
【发布时间】:2020-06-16 21:13:09
【问题描述】:

简单的一行代码:

String thing = "Something";
thing += " something else" + " and more.";

IntelliJ IDEA 提供将此行更改为 4 种其他方式来实现相同的结果:

String.format()
StringBuilder.append()
java.text.MessageFormat.format()
Replace += with =

为什么? += 有什么问题?任何人都可以解释一下吗?谢谢。

【问题讨论】:

标签: java string intellij-idea string-concatenation intellij-inspections


【解决方案1】:

一般情况下,结果是不一样的。 + 运算符分配中间字符串,需要额外的内存。

String thing = "Something";
thing += " something else" + " and more."; // two allocations: to compute string inside expression ```" something else" + " and more."```` and to execute ```+=```

通过使用StringBuilder,您不会分配中间结果,例如需要更少的内存。

在您使用短行且没有循环的情况下,预计不会有实际的性能提升。但是对于循环,您会收到O(N^2) 的复杂性。请查看this answer 并附上解释示例。

【讨论】:

  • 在纸上这是真的(知道可能有用)。实际上,这并不重要,因为编译器无论如何都会对其进行优化并使用 StringBuilder 而不是直接连接。供参考:docs.oracle.com/javase/specs/jls/se8/html/…(小字体的文字)。
  • @Amongalen,是的。编译器可以对此进行优化(理论上对于某些版本)。正如我所说,这段代码不需要任何StringBuilder,因为这里没有循环。
  • 感谢@ManushinIgor。实际代码包含超过 1000 行,其中许多注释是由 IntelliJ 放置的。主要任务是生成长行文本,因此 StringBuilder 将有助于优化代码。谢谢。
  • 两个字符串文字的连接将在编译时解析为单个字符串常量,所以这里唯一真正的问题是+=
【解决方案2】:

我假设你指的是这个:

这实际上不是解决您的代码的“问题”,如铅笔图标所示。对代码问题的修复用灯泡标识,例如不使用 thing 的值:

铅笔只是意味着“这是更改代码的快捷方式,因此您不必手动更改它”。将a += b 更改为a = a + b 通常并不需要太多工作,但是其他一些事情,例如将 for-each 循环更改为常规 for 循环,就可以了。

如果你突然想起你需要数组的索引来做某事,这可能会很有用。

【讨论】:

  • 这些“快捷方式”被称为意图操作,可以在 File | 中找到/启用/禁用。设置 |编辑 |意图 (jetbrains.com/help/idea/intention-actions.html)
  • 感谢@Sweeper 的回复。我只是想知道是否有充分的理由使用其中一种方法。但正如您所解释的:这不是 IntelliJ 的这些言论的目的。谢谢。
  • 顺便说一句。这些 IntelliJ 评论真的很有教育意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多