当遇到连续的字符串操作时,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 Times | 100 Times | 200 Times | 500 Times | 1000 Times | 5000 Times | 10000 Times | 50000 Times | 100000 Times |
1 | 0 | 2 | 3 | 9 | 63 | 175 | 5170 | 24403 |
0 | 1 | 1 | 4 | 11 | 65 | 178 | 5232 | 24077 |
0 | 0 | 5 | 3 | 11 | 82 | 179 | 5266 | 24133 |
0 | 0 | 1 | 4 | 10 | 77 | 179 | 5367 | 24133 |
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 Times | 100 Times | 200 Times | 500 Times | 1000 Times | 5000 Times | 10000 Times | 50000 Times | 100000 Times |
1 | 0 | 1 | 2 | 7 | 47 | 99 | 2699 | 12650 |
0 | 0 | 1 | 2 | 6 | 46 | 98 | 2679 | 12185 |
0 | 1 | 1 | 2 | 6 | 45 | 93 | 2666 | 12511 |
1 | 0 | 1 | 2 | 7 | 54 | 94 | 2669 | 12143 |
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 Times | 100 Times | 200 Times | 500 Times | 1000 Times | 5000 Times | 10000 Times | 50000 Times | 100000 Times |
0 | 0 | 0 | 1 | 1 | 11 | 12 | 12 | 8 |
0 | 0 | 0 | 1 | 1 | 11 | 23 | 15 | 9 |
0 | 0 | 0 | 0 | 1 | 13 | 24 | 15 | 10 |
0 | 0 | 0 | 0 | 1 | 17 | 12 | 11 | 11 |
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 Times | 100 Times | 200 Times | 500 Times | 1000 Times | 5000 Times | 10000 Times | 50000 Times | 100000 Times |
0 | 0 | 0 | 0 | 1 | 12 | 18 | 9 | 8 |
0 | 0 | 0 | 1 | 1 | 10 | 19 | 11 | 13 |
0 | 0 | 1 | 0 | 1 | 9 | 13 | 7 | 8 |
0 | 0 | 0 | 0 | 1 | 12 | 27 | 9 | 9 |
分析:
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.