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

在这里插入图片描述
这是在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时间。

先对比StringBuilderStringBuffer两个的源码:
在这里插入图片描述

在这里插入图片描述

从这两段源码可以看出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。

参考

博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值