java 几种拼接字符串的效率问题
拼接字符串,大致有3个class可以用,他们是String, StringBuffer,StringBuilder, StringBuilder是1.5中来代替StringBuffer的。检验方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub long n = 30000 ; System.out.println( "Start... " +n); long start1 = System.currentTimeMillis(); String s1 = new String( "hello" ); for ( long i = 0 ; i < n; i++) { s1+= "拼接字符串的时间" ; } long end1 = System.currentTimeMillis(); long time1 = end1 -start1; System.out.println( "用String+=拼接字符串的时间" +time1); long start2 = System.currentTimeMillis(); String s2 = new String( "hello" ); for ( long i = 0 ; i < n; i++) { s2=s2+ "拼接字符串的时间" ; } long end2 = System.currentTimeMillis(); long time2 = end2 -start2; System.out.println( "用String=String+拼接字符串的时间" +time2); long start3 = System.currentTimeMillis(); String s3 = new String( "hello" ); for ( long i = 0 ; i < n; i++) { s3=s3.concat( "拼接字符串的时间" ); } long end3 = System.currentTimeMillis(); long time3 = end3 -start3; System.out.println( "用String.concat拼接字符串的时间" +time3); long start4 = System.currentTimeMillis(); StringBuffer s4 = new StringBuffer( "hello" ); for ( long i = 0 ; i < n; i++) { s4.append( "拼接字符串的时间" ); } long end4 = System.currentTimeMillis(); long time4 = end4 -start4; System.out.println( "用StringBuffer.append拼接字符串的时间" +time4); long start5 = System.currentTimeMillis(); StringBuilder s5 = new StringBuilder( "hello" ); for ( long i = 0 ; i < n; i++) { s5.append( "拼接字符串的时间" ); } long end5 = System.currentTimeMillis(); long time5 = end5 -start5; System.out.println( "用StringBuilder.append拼接字符串的时间" +time5); System.out.println( "End..." ); } } |
贴出一组检测数据如下:
1 2 3 4 5 6 7 | Start... 30000 用String+=拼接字符串的时间 27468 用String=String+拼接字符串的时间 25813 用String.concat拼接字符串的时间 12265 用StringBuffer.append拼接字符串的时间 14 用StringBuilder.append拼接字符串的时间 8 End... |
1、String类本身是final类型,字符串拼接时,会使用StringBuffer,并调用append,之后再调用toString方法。而StringBuffer转换成String时,开销相当大。中间不仅创立了临时对象StringBuffer,还每次完后再要转成String。
2、在做字符串连接时,String类的concat方法优于+号。 ( String += ) 与 ( String = String + ) 相率相当。
3、而
StringBuilder的出现就是用来替换StringBuffer的,但不适宜于多线程编程。从这点儿上来说,StringBuilder
在单线程编程情况下应优先于StringBuffer使用,而在多线程编程时则应使用StringBuffer,不宜使用StringBuilder 。
4、单线程情况下做字符串连接,StringBuilder.append 与 StringBuffer.append 效率相当。
文章转载自:http://blog.csdn.net/amork/article/details/4307072 谢谢 amork 的分享
不管在什么地方上班,请记住:
工作不养闲人,团队不养懒人。入一行先别惦记着赚钱,先学着让自己值钱。赚不到钱赚知识;赚不到知识赚经历;赚不到经历赚阅历;以上都赚到了就不可能赚不到钱。只有先改变自己的态度,才能改变人生的高度。
让一个人迷茫的原因只有一个,那就是本该拼搏的年纪,却想的太多,做的太少。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库