StringBuffer 和 StringBuilder 中的警告
Posted
技术标签:
【中文标题】StringBuffer 和 StringBuilder 中的警告【英文标题】:Warning in StringBuffer and StringBuilder 【发布时间】:2017-08-23 19:11:49 【问题描述】:我在 for 循环外部初始化了一个 StringBuffer,在 for 循环内部我正在连接一些字符串。
我收到警告
'StringBuffer stringBuffer' 可以声明为'StringBuilder'
和
字符串连接作为“stringbuilder.append()”调用的参数
然后我将 StringBuffer 更改为 StringBuilder,因为它比 StringBuffer 快。现在我收到警告为
字符串连接作为 'stringbuilder.append()' 调用的参数
示例代码:
public static String stringConcat(String[] words)
StringBuffer stringBuffer = new StringBuffer();
for (String word : words)
stringBuffer.append(word).append(" ");
return stringBuffer.toString();
为什么我会收到这些警告。
编辑实际代码:
stringBuffer.append(word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase()).append(" ");
【问题讨论】:
您绝对应该更喜欢StringBuilder
而不是StringBuffer
,如果您可以使用Java 8+ 语言功能 - 我更喜欢return Stream.of(words).collect(Collectors.joining(" "));
这正是消息所说的。不要在append()
中连接字符串。也不要发布混淆问题的示例代码。
好的。谢谢@ElliottFrisch。但我仍然收到警告,因为字符串连接作为 stringBuffer.append(word).append(""); 中的 'stringbuilder.append()' 调用的参数。我无法在我的应用程序中使用 java 8 功能。
【参考方案1】:
使用StringBuilder
而不是StringBuffer
public static String stringConcat(String[] words)
StringBuilder stringBuilder = new StringBuilder();
for (String word : words)
stringBuilder.append(word).append(" ");
return stringBuilder.toString();
【讨论】:
【参考方案2】:关键是:您仍在使用 + 运算符来处理您给 append()
的表达式中的字符串:
... word.substring(0, 1).toUpperCase() + word...
这否定了使用 StringBuilder(或 StringBuffer)的全部意义。
改为:只需调用append()
两次!使用缓冲区/构建器的核心思想是仅使用附加调用来连接您想要的结果;喜欢:
append(word.substring(0, 1).toUpperCase()).append(word...
【讨论】:
我没有看到“这否定了使用 StringBuilder 的全部意义”。有时附加与 + 放在一起的子字符串更具可读性。可能会考虑在 IntelliJ 等中使用 WarningSupression,例如 //noinspection StringConcatenationInsideStringBufferAppend @Simeon StringBuilder 的重点是效率。请记住,编译器会将 String+ 转换为 ... 另一个 StringBuilder 实例,该实例将用于将您为+
的所有字符串连接在一起。因此,不是直接附加到您自己手动定义的构建器,而是创建另一个构建器,附加东西,toString() 被调用......无缘无故。当然,有很多方法可以做到这一点,比如 String.format() 等等。但是将 builder 和 string+ 结合起来......这只是一个非常令人惊讶的解决方案。
干净代码的一个关键属性:它不会让读者感到惊讶!以上是关于StringBuffer 和 StringBuilder 中的警告的主要内容,如果未能解决你的问题,请参考以下文章
StringBuffer 和 StringBuilder 总结