1
2
StringBuffer 是线程安全的
3
StringBuilder 不保证线程安全(在1.5中引入的),一般情况下比StringBuffer快
4![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
5
一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中。您也许会使用
+
来串联字符串以达到附加新字符或字符串的目的,但
+
会产生一个新的String实例。如果程序对这种附加字符串的需求很频繁,并不建议使用
+
来进行字符串的串联。在面向对象程序设计中,最好是能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为。
6
J2SE
5
.0提供java.lang.StringBuilder类,使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高。通过下面的简单测试程序就可以知道效能差距有多大。
7
ü 范例6.
5
AppendStringTest.java
8![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public
class
AppendStringTest
{
9![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void main(String[] args)
{
10
String text = "";
11![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
12
long beginTime = System.currentTimeMillis();
13
for(int i = 0; i < 10000; i++)
14
text = text + i;
15
long endTime = System.currentTimeMillis();
16
System.out.println("执行时间:" + (endTime - beginTime));
17![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
18
StringBuilder builder = new StringBuilder("");
19
beginTime = System.currentTimeMillis();
20
for(int i = 0; i < 10000; i++)
21
builder.append(String.valueOf(i));
22
endTime = System.currentTimeMillis();
23
System.out.println("执行时间:" + (endTime - beginTime));
24
}
25
}
26![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
27
在范例6.5中首先使用
+
来串联字符串,使用System.currentTimeMillis()取得for循环执行前、后的系统时间,这样就可以得知for循环执行了多久。以下是我的计算机上的测试数据:
28![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
29
执行时间:
4641
30
执行时间:
16
31
可以看到执行的时间差距很大,这说明了使用
+
串联字符串所带来的负担。如果有经常作附加字符串的需求,建议使用StringBuilder。事实上就范例6.5来说,第二个for循环执行时间还可以更短,因为append()也可以接受基本数据类型,所以不必特地使用String.valueOf()方法从int取得String。改为以下的方式,执行时间可以大幅缩短:
32
for
(
int
i
=
0
; i
<
10000
; i
++
)
33
builder.append(i);
34
使用StringBuilder最后若要输出字符串结果,可以用toString()方法。可以使用length()方法得知目前对象中的字符长度,而capacity()可返回该对象目前可容纳的字符容量。另外,StringBuilder还有像insert()方法可以将字符插入指定的位置,如果该位置以后有字符,则将所有的字符往后移;deleteChar()方法可以删除指定位置的字符,而reserve()方法可以反转字符串。详细的使用可以查询java.lang.StringBuilder的API文件说明。
35
StringBuilder是J2SE
5
.0才新增的类,在J2SE
5
.0之前的版本若有相同的需求,则使用java.lang.StringBuffer。事实上,StringBuilder被设计为与StringBuffer具有相同的操作接口。在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
2
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
3
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
4
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
5
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
6
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
7
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
8
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
9
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
10
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
11
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
12
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
13
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
14
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
15
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
16
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
18
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
19
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
20
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
21
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
22
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
23
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/InBlock.gif)
24
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
25
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
26
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
27
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
28
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
29
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
30
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
31
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
32
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
33
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
34
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)
35
![](http://zhangbosix.iteye.com/Images/OutliningIndicators/None.gif)