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 中的警告的主要内容,如果未能解决你的问题,请参考以下文章

java面试

面试泄漏:通过17道题了解阿里Java研发岗需求

java中操作字符串都有哪些类?它们之间有什么区别?

StringBuffer 和 StringBuilder 总结

转载String和StringBuffer的区别,以及StringBuffer的常用方法介绍

Stringbuffer和StringBuilder