首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

String,StringBuffer仍是StringBuilder

2012-09-03 
String,StringBuffer还是StringBuilder??????????? + (over - begin) + 毫秒 )??????? ??? } ??? pub

String,StringBuffer还是StringBuilder

??????????? + (over - begin) + " 毫秒 " );???????

??? }


??? public void test(StringBuffer s){

?

??????? long begin = System.currentTimeMillis();

??????? for(int i=0;i<ttime;i++){

??????????? s.append("add");

??????? }

??????? long over = System.currentTimeMillis();

??????? System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为: "

??????????? + (over - begin) + " 毫秒 " );???????

??? }

??? public void test(StringBuilder s){

??????? long begin = System.currentTimeMillis();

??????? for(int i=0;i<ttime;i++){

??????????? s.append("add");

??????? }

??????? long over = System.currentTimeMillis();

??????? System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为: "

??????????? + (over - begin) + " 毫秒 " );???????

??? }

??? // 对 String 直接进行字符串拼接的测试

??? public void test2(){

??????? String s2 = "abadf";

??????? long begin = System.currentTimeMillis();

??????? for(int i=0;i<ttime;i++){

??????????? String s = s2 + s2 + s2 ;

??????? }

??????? long over = System.currentTimeMillis();

??????? System.out.println(" 操作字符串对象引用相加类型使用的时间为: "

??????????? + (over - begin) + " 毫秒 " );???????

??? }

??? public void test3(){

??????? long begin = System.currentTimeMillis();

??????? for(int i=0;i<ttime;i++){

??????????? String s = "abadf" + "abadf" + "abadf" ;

??????? }

??????? long over = System.currentTimeMillis();

??????? System.out.println(" 操作字符串相加使用的时间为: "

??????????? + (over - begin) + " 毫秒 " );???????

??? }

???

??? public static void main(String[] args){

??? String s1 ="abc";

??? StringBuffer sb1 = new StringBuffer("abc");

??? StringBuilder sb2 = new StringBuilder("abc");

??? testssb t = new testssb();

??? t.test(s1);

??? t.test(sb1);

??? t.test(sb2);

??? t.test2();

??? t.test3();

??? }

}?
?

以上代码在 NetBeans 5.0 IDE/JDK1.6 上编译通过

循环次数 ttime 为 10000 次的测试结果如下:

操作 java.lang.String 类型使用的时间为: 4392 毫秒

操作 java.lang.StringBuffer 类型使用的时间为: 0 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 0 毫秒

操作字符串对象引用相加类型使用的时间为: 15 毫秒

操作字符串相加使用的时间为: 0 毫秒?
?

好像还看不出 StringBuffer 和 StringBuilder 的区别,把 ttime 加到 30000 次看看:

操作 java.lang.String 类型使用的时间为: 53444 毫秒

操作 java.lang.StringBuffer 类型使用的时间为: 15 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 15 毫秒

操作字符串对象引用相加类型使用的时间为: 31 毫秒

操作字符串相加使用的时间为: 0 毫秒?
?

StringBuffer 和 StringBuilder 的性能上还是没有太大的差异,再加大到 100000 看看,这里就不加入对 String 类型的测试了,因为对 String 类型这么大数据量的测试会很慢滴……

操作 java.lang.StringBuffer 类型使用的时间为: 31 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 16 毫秒?
?

能看出差别了,但其中有多次的测试结果居然是 StringBuffer 比 StringBuilder 快,再加大一些到 1000000 看看(应该不会当机吧?):

操作 java.lang.StringBuffer 类型使用的时间为: 265 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 219 毫秒?
?

有些少区别了,而且结果很稳定,再大点看看, ttime = 5000000 :

······ Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ······

呵呵,算了,不去测试了,基本来说都是在性能上都是 StringBuilder > StringBuffer > String 的了。

其实我这里测试并不是很公平,因为都放在了一起以先后顺序进行,测试方法中间没有考虑到JVM的GC收集前面产生的无引用对象垃圾而对执行过程的中断时间。如果大家有更好的想法或者思路欢迎跟我讨论:chenpengyi#gmail.com。

?

热点排行