上文介绍了SringBuffer,StringBuilder和String在拼接字符串时候的效率对比。可以看出效率 StringBuilder > StringBuffer > String。但是我们在使用的过程中,最后都会把SringBuffer和StringBuilder转成String进行使用。它们两个都有toString方法可以调用,那么它们转成String的效率也是 StringBuilder > StringBuffer 吗?
答案:不一定!!!
测试代码走起:
@Test
public void test2() {
long startTime = 0L;
long endTime = 0L;
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
buffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
builder.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
buffer.toString();
endTime = System.currentTimeMillis();
System.out.println("StringBuffer转成String,耗时:" + (endTime - startTime));
startTime = System.currentTimeMillis();
builder.toString();
endTime = System.currentTimeMillis();
System.out.println("StringBuilder转成String,耗时:" + (endTime - startTime));
}
这是我运行多次,截取了2次的结果截图:
可以看出,多次运行也会出现StringBuffer的toString时间要小于StringBuilder的toString时间的情况。
总结:
在拼接字符串方面,StringBuilder要比StringBuffer效率要高,但是在转成String的时候,两者效率不相上下。
如何使用:
根据具体项目来判断使用哪个,没有必要纠结一定要使用哪个。
如果是单线程不需要考虑同步问题,则可以使用StringBuilder提高效率。
如果是多线程需要考虑数据同步问题,就要使用StringBuffer确保线程安全。