为啥 IntelliJ 要我改变这个?

Posted

技术标签:

【中文标题】为啥 IntelliJ 要我改变这个?【英文标题】: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 =

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

【问题讨论】:

这些建议称为意向操作。它们可以在 File | 中找到/启用/禁用。设置 |编辑 |意图(见jetbrains.com/help/idea/intention-actions.html 标题含糊。重写以总结您的具体技术问题。 【参考方案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 评论真的很有教育意义。

以上是关于为啥 IntelliJ 要我改变这个?的主要内容,如果未能解决你的问题,请参考以下文章

百度为啥要我提问?

为啥 codecoverage 要我覆盖定义变量?

为啥 IntelliJ 不断从这个 JavaScript 模板字符串中删除反引号?

在天猫上购物己付清全款,为啥收到货后再次要我付款到支付宝?是不是重复付款?

为啥 JSLint 要我使用双引号而不是单引号?预期为 '"' 而看到的是 '''

为啥 gcc 要我链接到 libgcc_ext.10.5.dylib?