【问题标题】:Warning in StringBuffer and StringBuilderStringBuffer 和 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 功能。

标签: java android stringbuilder string-concatenation stringbuffer


【解决方案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+ 结合起来......这只是一个非常令人惊讶的解决方案。
    • 干净代码的一个关键属性:它不会让读者感到惊讶!
    猜你喜欢
    • 2011-02-27
    • 2010-09-26
    • 2017-05-27
    • 2011-04-16
    • 2015-12-13
    • 2011-04-16
    相关资源
    最近更新 更多