由于String对象是不可变对象,因此,在需要对字符串进行修改操作时(如字符串连接,替换),String对象总是会生成新的对象,所以,其性能相对较差。为此,JDK专门提供了用于创建和修改字符串的工具,这就是StringBuilder和StringBuffer类。
StringBuilder和StringBuffer是一对孪生兄弟,它们都实现了AbstractStringBuilder抽象类,拥有几乎相同的对外接口,两者的最大不同在于StringBuffer对几乎所有的方法都做了同步,而StringBuilder并没有做任何同步。
由于方法同步需要消耗一定的系统资源,因此,StringBuilder的效率也好于StringBuffer。但是,在多线程中,StringBuilder无法保证线程安全,不能使用。
long sbBegin = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
// StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000000; i++)
{
sb.append(i);
}
long sbOver = System.currentTimeMillis();
System.out.println(sbOver-sbBegin);
在笔者的计算机中,StringBuffer耗时111ms,StringBuilder耗时100ms。可见,非同步的StringBuilder拥有更高的效率。
在无需考虑线程安全的情况下,可以使用性能相对较好的StringBuilder,但若系统有线程安全要求,只能选择StringBuffer。
总结来说,
1.如果要操作少量的数据用String。
2.单线程操作字符串缓冲区下操作大量数据用StringBuilder。
3.多线程操作字符串缓冲区下操作大量数据用StringBuffer。