这是在leedcode上面的一简单道题,我把里面的string
拼接改成stringbuilder
的append
之后速度的提升效果。
瞬间提升了92ms,是不是很牛逼,我也觉得。
看了别人的解释,String自身拼接是需要每次去创建一次新的字符串,所以速度很慢。
在此做了一个实验:
实验内容:对比String、StringBuilder、StringBuffer三种拼接所需耗时时长。
System.out.println("--------------------------------String-------------------------------");
long time = System.currentTimeMillis();
String aString = "abc";
for(int i = 0; i < 100000; i++) {
aString = aString + "第"+i+"個bcd";
}
System.out.println(System.currentTimeMillis() - time);
aString = null;
System.out.println("--------------------------------StringBuffer-------------------------------");
long time2 = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer("12");
for(int i = 0; i < 100000; i++) {
stringBuffer.append( "第"+i+"個bcd");
}
System.out.println(System.currentTimeMillis() - time2);
stringBuffer = null;
System.out.println("--------------------------------stringBuilder-------------------------------");
long time3 = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder("12");
for(int i = 0; i < 100000; i++) {
stringBuilder.append( "第"+i+"個bcd");
}
System.out.println(System.currentTimeMillis() - time3);
stringBuilder = null;
输出的结果是:
可以很明显的从输出结果看出,里面耗时最长的是String
拼接时间,耗时最短的是StringBuilder
时间。
先对比StringBuilder
和StringBuffer
两个的源码:
从这两段源码可以看出StringBuffer
是有线程锁的,所以没有线程锁的StringBuilder
的append
方法会速度更快一点,而String
的话,每次拼接的时候都需要创建一个新的String字符串,所以需要消耗的时间就更多。
string拼接流程:
计算str + "2"
;
先判断"str"
是不是null
,不是,那么str.toString()
,将str.toString()
作为初始化的值,初始化StringBuilder
中,使用append
方法,然后对"2"
也是这样的处理,就相当于用了两次StringBuilder
的append
方法,最后再把得到的值转成String
输出(new
一个String
输出)。
所以直接用String方法拼接就是最慢的了。
结论
拼接速度:
String < StringBuffer < StringBuilder
拼接字符串的时候,StringBuffer是线程安全的,而String 和 StringBuilder是线程不安全的,而且String还慢,所以轮到拼接字符串,且不需要管线程是否安全时候,请优先选用StringBuilder。