StringBuilder 和 StringBuffer的区

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问

StringBufferStringBuilder 主要有哪些区别呢?它们之间是否存在一些性能方面的讨论话题呢?

回答1

StringBuffer 是同步的,而 StringBuilder 却不是。

StringBuilder 主要为了解决 StringBuilder 的异步问题。

在大部分情况下,是几乎不需要同步的。如果有人想使用 StringBuilder 进行同步,则只需在实例上使用同步代码块 {}

我赞同上述的说法,认为 StringBuffer 不是一个好的方式(除非你必须使用它的 API)。

对于那些将这两者混合使用的人来说,好的记忆方法是:Buffer,是较旧的版本,因此是同步的。较新的 Builder 类使用 Builder 模式,则是异步的。

但是,StringBufferStringBuilder 慢。您可以根据您的应用程序来选择对应的类型。

另一个区别是 StringBuffer 可以与 Matcher#appendReplacement 一起使用,而 StringBuilder 却不能一起使用。这是一个非常烦人的 API 差异,尤其是因为 Matcher 它不是线程安全的,因此不需要进行 appendReplacement 同步。

关于 StringBuilder 的多线程环境中失败的更多细节,可以参考:stackoverflow.com/questions/3…

回答2

StringBuilderStringBuffer 快,这是因为 StringBuilder 不是 synchronized的。

具体可看下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
java复制代码public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;

{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}

{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i > 0 ; i--) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}

运行结果是 StringBuffer 耗时 2241msStringBuilder 耗时 753ms

翻译内容来源Stack Overflow:stackoverflow.com/questions/3…

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%