String和StringBuilder和StringBuffer拼接字符串时候的区别

String和StringBuilder和StringBuffer拼接字符串时候的区别_第1张图片
这是在leedcode上面的一简单道题,我把里面的string拼接改成stringbuilderappend之后速度的提升效果。
瞬间提升了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和StringBuffer拼接字符串时候的区别_第2张图片
可以很明显的从输出结果看出,里面耗时最长的是String拼接时间,耗时最短的是StringBuilder时间。

先对比StringBuilderStringBuffer两个的源码:
String和StringBuilder和StringBuffer拼接字符串时候的区别_第3张图片

String和StringBuilder和StringBuffer拼接字符串时候的区别_第4张图片

从这两段源码可以看出StringBuffer是有线程锁的,所以没有线程锁的StringBuilderappend方法会速度更快一点,而String的话,每次拼接的时候都需要创建一个新的String字符串,所以需要消耗的时间就更多。

string拼接流程

计算str + "2";

先判断"str"是不是null,不是,那么str.toString(),将str.toString()作为初始化的值,初始化StringBuilder中,使用append方法,然后对"2"也是这样的处理,就相当于用了两次StringBuilderappend方法,最后再把得到的值转成String输出(new一个String输出)。

所以直接用String方法拼接就是最慢的了。

结论

拼接速度:

String < StringBuffer < StringBuilder

拼接字符串的时候,StringBuffer是线程安全的,而String 和 StringBuilder是线程不安全的,而且String还慢,所以轮到拼接字符串,且不需要管线程是否安全时候,请优先选用StringBuilder。

参考

博客

你可能感兴趣的:(java语法)