String, StringBuffer 和StringBuilder 执行时间上的比较

本文通过实验对比了String、StringBuffer和StringBuilder在不同操作次数下的性能表现。结果显示,StringBuilder在单线程环境中性能最佳。

  当遇到连续的字符串操作时,String str=str+"i", StringBuffer str=StringBuffer.append(i) 和StringBuilder str=StringBuilder.append(i) 有什么区别呢?

   思考两秒钟。。。




  用程序验证一下吧。

   代码:

      

package com.blueray.java.test;

public class StringOperation {
	public long stringAdd(long times){
		long startTime=System.currentTimeMillis();
		
		String s="";
		
		for(long i=0;i<times;i++){
			s=s+i;
		}
		
		
		long endTime=System.currentTimeMillis();
		
		long timeBuf= endTime-startTime;
		System.out.println(timeBuf+",");
		return timeBuf;
	}
}

执行代码:

    

public class String_StringBuffer_Compare {
	public static long TIMES_FIFTY = 50L;
	public static long TIMES_ONE_HUNDROD = 100L;
	public static long TIMES_TWO_HUNDROD = 200L;
	public static long TIMES_FIVE_HUNDROD = 500L;
	public static long TIMES_ONE_THOUSAND = 1000L;
	public static long TIMES_FIVE_THOUSAND = 5000L;
	public static long TIMES_TEN_THOUSAND = 10000L;
	public static long TIMES_FIFTY_THOUSAND = 50000L;
	public static long TIMES_HUNDROD_THOUSAND = 100000L;
	public static long[] times = { TIMES_FIFTY, TIMES_ONE_HUNDROD,
			TIMES_TWO_HUNDROD, TIMES_FIVE_HUNDROD, TIMES_ONE_THOUSAND,
			TIMES_FIVE_THOUSAND,TIMES_TEN_THOUSAND,TIMES_FIFTY_THOUSAND,TIMES_HUNDROD_THOUSAND};

	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		for (long time : times) {
//			StringOperation strOpt = new StringOperation();
//			strOpt.stringAdd(time);
//		}
//		for (long time : times) {
//			StringBufferOperation strOpt = new StringBufferOperation();
//			strOpt.stringAppend(time);
//		}
		
		for (long time : times) {
			StringBuilderOperation strOpt = new StringBuilderOperation();
			strOpt.stringAppend(time);
		}


	}

执行4次,结果:

  

50 Times100 Times200 Times500 Times1000 Times5000 Times10000 Times50000 Times100000 Times
1023963175517024403
01141165178523224077
00531182179526624133
00141077179536724133


StringConcatOperation:

package com.blueray.java.test;

public class StringConcatOperation {
	public long stringConcat(long times){
		long startTime=System.currentTimeMillis();
		
		String s="";
		
		for(long i=0;i<times;i++){
			s=s.concat(String.valueOf(i));
		}
		
		
		long endTime=System.currentTimeMillis();
		
		long timeBuf= endTime-startTime;
		System.out.println(timeBuf+",");
		return timeBuf;
	}
}

执行结果:

50 Times100 Times200 Times500 Times1000 Times5000 Times10000 Times50000 Times100000 Times
101274799269912650
001264698267912185
011264593266612511
101275494266912143




StringBufferOperation:

package com.blueray.java.test;

public class StringBufferOperation {
	public long stringAppend(long times){
		long startTime=System.currentTimeMillis();
		
		StringBuffer s=new StringBuffer();
		
		for(long i=0;i<times;i++){
			s.append(i);
		}
		
		
		long endTime=System.currentTimeMillis();
		
		long timeBuf= endTime-startTime;
		System.out.println(timeBuf+",");
		return timeBuf;
	}
}

 结果:

   

50 Times100 Times200 Times500 Times1000 Times5000 Times10000 Times50000 Times100000 Times
000111112128
000111123159
0000113241510
0000117121111



StringBuilderOperation:

   

package com.blueray.java.test;

public class StringBuilderOperation {
	
	public long stringAppend(long times){
		long startTime=System.currentTimeMillis();
		
		StringBuilder s=new StringBuilder();
		
		for(long i=0;i<times;i++){
			s.append(i);
		}
		
		
		long endTime=System.currentTimeMillis();
		
		long timeBuf= endTime-startTime;
		System.out.println(timeBuf+",");
		return timeBuf;
	}
}
 结果:

50 Times100 Times200 Times500 Times1000 Times5000 Times10000 Times50000 Times100000 Times
00001121898
0001110191113
0010191378
00001122799



   分析: 

      1. 从图上可以看出,StringBuilder 和StringBuffer的执行效率,要比String 要好

      2. StringBuffer 和StringBuilder,在执行次数从5000到10000时,执行时间都有大幅上升,StringBuilder的时间增加曲线会更陡峭,说明StringBuilder 比StringBuffer,在单线程环境下会更好一些。


   结论:

     在执行时间上,String比两个SB的效率要差。  在不考虑多线程环境下,使用StringBuilder效果会更好。

     不足:

         (1). String 的累加是String 对象类型,而StringBuffer 和StringBuilder则添加的是long 型,虽然不太了解StringBuffer.append添加string 和添加long 有什么区别,但是如果改成append(String),可能比较会更加公平

         (2).没有比较String.concat.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

查理曼大帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值