StringBuilder.append() 应该总是比串联更受欢迎吗?

问题描述

我有一些这样的代码

StringBuilder rgba = new StringBuilder();  
for (...){
....
rgba.append(value + ",");
}

IntelliJ 向我显示以下警告:

string concatenation as argument to 'stringbuilder.append()' call

herehere 和其他来源我了解到连接实际上是创建一个新的 String 对象,并且否定了使用 StringBuilder 的全部意义。
所以IntelliJ建议我使用

rgba.append(value);
rgba.append(",");  

代替

rgba.append(value + ",");  

但这真的会更好吗?
这段代码会更清晰吗?
这会加快执行速度吗?

解决方法

根据 IntelliJ 推理:

报告用作参数的字符串连接到 StringBuffer.append()、StringBuilder.append() 或 Appendable.append()。 这样的调用可能会有利地转变为链式追加调用 现有的 StringBuffer/Builder/Appendable,节省了额外的成本 StringBuffer/Builder 分配。此检查忽略编译时间 评估字符串连接,当转换为链接时 追加调用只会降低性能。

所以,我会说:去吧!

,

您所说的是正确的,因为连接和 StringBuilder 的混合在理论上与使用它背道而驰,但我们所谈论的额外性能非常小,除非您循环有大量的迭代。

就代码清晰度而言,我认为双 append 实际上更清晰,因为您无论如何都在使用它。

我将这两个语句视为

Append "," appended on "value"
Append "value"
Append ","

其中第二个实际上看起来更简洁,即使代码在技术上更长。

,

在我看来,串联对于开发人员来说更具可读性,但 StringBuilder.append 是高性能的