什么时候在stringbuilder/stringbuffer上使用字符串?

Shr*_*wat 2 java string

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

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

JB *_*zet 6

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

String的效率不低于StringBuilder(不知道你在哪里得到它).它实际上更有效率,因为它是不可变的,你可以在不需要防御性副本的情况下分享引用.

最重要的是:性能通常不是主要关注点.更重要的是正确性,可读性,安全性和可维护性.并且使用不可变的String会增加所有这些因素.

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

String s = "";
for (String part: collection) {
    s += part;
}
Run Code Online (Sandbox Code Playgroud)

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

StringBuilder builder = new StringBuilder();
for (String part: collection) {
    builder.append(part);
}
String s = builder.toString();
Run Code Online (Sandbox Code Playgroud)