java - 什么时候在 stringbuilder/stringbuffer 上使用 string?

标签 java string

我突然想到一个问题,如果 StringBuilder/StringBuffer 总是比 String 好,那我们为什么还要使用它?

我的意思是不应该总是使用 StringBuilder/StringBuffer 来完全替换 String 吗?据说“如果 Object 值不会改变,请使用 String 类,因为 String 对象是不可变的”,但我们也可以使用 StringBuilder/StringBuffer 并获得更好的性能。

最佳答案

String 比 StringBuilder 提供更多的功能。正如其名称所暗示的,StringBuilder 的唯一目的是构建一个字符串。

String 的效率不亚于 StringBuilder(不知道你从哪里弄来的)。它实际上更有效,因为它是不可变的,您可以安全地共享引用而无需防御性副本。

最重要的是:性能通常不是主要问题。更重要的是正确性、可读性、安全性、可维护性。使用不可变字符串会增加所有这些因素。

如果 String 比 StringBuilder 好那么多,那我们为什么要有 StringBuilder?因为有一个使用 StringBuilder 比使用 String 更有效的用例:通过重复附加部分来构造 String:

String s = "";
for (String part: collection) {
    s += part;
}

上面的代码很慢,因为创建和复制了许多临时 String 对象,然后必须进行 GC。在这种情况下,使用 StringBuilder:

StringBuilder builder = new StringBuilder();
for (String part: collection) {
    builder.append(part);
}
String s = builder.toString();

关于java - 什么时候在 stringbuilder/stringbuffer 上使用 string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29642145/

相关文章:

java - 使用正则表达式查找一组+JAVA

java - Java 中创建字符串的时间

c# - 调试/逐步执行某些 Java 代码的步骤?

java - Android/Gradle 构建失败 : Could not find dependency

java - 如何在 Ubuntu 的 .sh 文件中定位 java 类?

python - 从 DataFrame 列标题中删除非 ASCII 字符

java - 如何处理最终字符串?

java - Guava - map 支持的 Guava 功能

java - 在 Spring Batch 上下文中将子字符串与 SpEL 一起使用

c - 如何从文本文件中分离二进制字符串并将它们存储在一维或二维字符数组中?