为啥 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 要我改变这个?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 IntelliJ 不断从这个 JavaScript 模板字符串中删除反引号?
在天猫上购物己付清全款,为啥收到货后再次要我付款到支付宝?是不是重复付款?