控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

关于String和StringBuilder、StringBuffer的一个简单性能测试

作者:未知 出处:cnblog 2013年08月05日 阅读:

 String a=String b + String c + String d

 
这种代码在程序里应该随处可见,一部分人不知道这段代码的缺陷在哪,另一部分人知道这样写不好,但是太顺手了下意识就写了。
 
在Java里,String是个不可变对象,所以右边的每次赋值操作都会new一个新对象,b+c,b+c+d,至少会new两个,很明显性能不佳。但是这个问题没有大多数情况下没我们想象的那么严重,因为编译器在编译时会对String做很多优化,但是对于一些运行时的赋值和修改操作,编译器很难优化,这种时候,就强烈不推荐这样写,虽然写的很顺手 ,但是性能不行,如果存在字符串的修改操作,就应该用StringBuilder和StringBuffer。
 
下面,就用一个简单的测试,来看看他们之间的性能差别,让我们心里有数。
 
1. 测试String直接拼接
 
 
 1     public static void main(String[] args) {
 2         long begin = System.currentTimeMillis();
 3         String str = "";
 4         for(int i=0;i<10000;i++){
 5             str = str+i;
 6         }
 7         long end = System.currentTimeMillis();
 8         long time = end - begin;
 9         System.out.println(time+"");
10     }直接用String的拼接,循环调用10000次,跑出来结果是639毫秒
 
2.测试String.concat拼接
 
 
 1     public static void main(String[] args) {
 2         long begin = System.currentTimeMillis();
 3         String str = "";
 4         for(int i=0;i<10000;i++){
 5             str = str.concat(String.valueOf(i));
 6         }
 7         long end = System.currentTimeMillis();
 8         long time = end - begin;
 9         System.out.println(time+"");
10     }也是循环调用10000次,跑出来结果是322毫秒
 
3.测试StringBuilder拼接
 
 
 1     public static void main(String[] args) {
 2         long begin = System.currentTimeMillis();
 3         StringBuilder sb = new StringBuilder();
 4         for(int i=0;i<10000;i++){
 5             sb.append(i);
 6         }
 7         long end = System.currentTimeMillis();
 8         long time = end - begin;
 9         System.out.println(time+"");
10     }
11 
12 }同样循环调用10000次,结果是5毫秒。换成StringBuffer,结果也是一样。
 
上面这个简单测试,可以用数据告诉我们,String和StringBuilder、StringBuffer之间的性能差距了,所以如果字符串有变更,都用StringBuilder和StringBuffer,而不是用简单粗暴的赋值操作,另外就是,上面可以看出,String的concat性能也明显优于直接拼接。
 
关于StringBuilder和StringBuffer
 
这两个操作可变字符串的类,都实现了AbstractStringBuilder抽象类,接口也几乎一样,他的最大区别是:StringBuffer基本所有方法都做了同步,而StringBuilder没有,换言之,StringBuffer是线程安全的,StringBuilder不是。所以这两个就根据不同的场景做取舍就ok。
 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统