StringBuffer和StringBuilder中的警告

25

我在for循环外初始化了一个StringBuffer,在for循环内我进行一些字符串拼接。

我得到了警告

'StringBuffer stringBuffer' 可以声明为 'StringBuilder'

将字符串连接作为 'stringbuilder.append()'调用的参数

然后我将该StringBuffer更改为StringBuilder,因为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(" ");

3
你应该毫不犹豫地选择StringBuilder而非StringBuffer,如果你可以使用Java 8+的语言特性,我会更喜欢使用return Stream.of(words).collect(Collectors.joining(" ")); - Elliott Frisch
4
请勿在append()内连接字符串。同时,不要发布混淆问题的示例代码。 - shmosel
好的。谢谢@ElliottFrisch。但是我仍然收到警告,即在stringBuffer.append(word).append(" ");中将字符串连接作为参数传递给'stringbuilder.append()'调用。我无法在我的应用程序中使用Java 8功能。 - Abish R
2个回答

38

重点是:您在向append()函数提供的表达式中仍然使用了字符串的+运算符:

... word.substring(0, 1).toUpperCase() + word...
那会使使用StringBuilder(或StringBuffer)失去意义。
相反,只需简单地调用append()两次!使用缓冲区/构建器的核心思想是仅使用附加调用来连接所需的结果,例如:
append(word.substring(0, 1).toUpperCase()).append(word...

3
我认为“这否定了使用 StringBuilder 的整个意义”的说法不正确。有时候,使用加号将子字符串连接起来,比使用 StringBuilder 更易读。你可以考虑在 IntelliJ 或类似的软件中使用 WarningSupression,例如: //noinspection StringConcatenationInsideStringBufferAppend - Simeon
1
@Simeon StringBuilder 的重点在于效率。请记住,编译器会将 String+ 转换为另一个 StringBuilder 实例,该实例将用于连接您正在 + 在一起的所有字符串。因此,不是直接附加到您自己手动定义的构建器中,而是创建另一个构建器,添加内容,调用 toString() ... 没有任何理由。当然,有许多方法可以做到这一点,例如 String.format() 等等。但是,结合 builder 和 string+ ... 这只是一个非常令人惊讶的解决方案。 - GhostCat
优秀代码的一个关键特征:不会让读者感到惊讶! - GhostCat

6

使用 StringBuilder 代替 StringBuffer

 public static String stringConcat(String[] words) {
    StringBuilder stringBuilder = new StringBuilder();

    for (String word : words) {
        stringBuilder.append(word).append(" ");
    }
    return stringBuilder.toString();
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接