当前位置: 首页 > 后端技术 > Java

您还在使用+来连接for循环中的字符串吗?明天不要来上班!

时间:2023-04-02 01:29:13 Java

作者:Keatsafterpuberty\链接:https://www.cnblogs.com/keats...介绍中说StringBuilder在处理字符串拼接方面比String效率更高,但有时我们的理解可能存在一定的偏差。最近在测试数据导入的效率时,发现之前对StringBuilder的部分理解是错误的。后来通过实践测试+找原理搞清楚了这块的逻辑。下面我把这个过程作为测试用例分享给大家。我们的代码在循环中拼接字符串一般有两种情况。第一种是在每次循环中将对象中的几个字段拼接成一个新的字段,然后赋值给对象。第二个操作是在循环外创建一个字符串对象,并在每次循环的时候给字符串拼接新的内容。循环结束后,得到拼接后的字符串。对于这两种情况,我创建了两个对照组。第一组:字符串在每个For循环中拼接,即准备使用,用完销毁。使用String和StringBuilder拼接/***String在一个循环内拼接字符串,循环一次后销毁*/publicstaticvoiduseString(){for(inti=0;i5){总和+=(结束-开始);}}returnsum/num;}主要方法publicclassStringTest{publicstaticfinalintCYCLE_NUM_BIGGER=10_000_000;publicstaticfinalintCYCLE_NUM_LOWER=10_000;publicstaticfinalStringstr1="张三";公共静鳍alStringstr2="李四";publicstaticfinalStringstr3="王舞";publicstaticfinalStringstr4="赵六";publicstaticvoidmain(String[]args)throwsInterruptedException{inttime=0;整数=5;time=executeSometime(1,num);System.out.println("字符串拼接"+CYCLE_NUM_BIGGER+"次,"+num+"平均时间:"+time+"ms");time=executeSometime(2,num);System.out.println("StringBuilder拼接"+CYCLE_NUM_BIGGER+"次,"+num+"次平均时间:"+time+"ms");time=executeSometime(3,num);System.out.println("字符串拼接单个字符串"+CYCLE_NUM_LOWER+"次,"+num+"次平均时间:"+time+"ms");time=executeSometime(4,num);System.out.println("StringBuilder拼接单个字符串"+CYCLE_NUM_LOWER+"次,"+num+"次平均时间:"+time+"ms");}}测试结果测试结果如下:分析第一组10_000_000次循环拼接。在循环内使用String和StringBuilder的效率是一样的!为什么?使用javap-cStringTest.class反编译查看两种方式编译的文件:可以发现优化后使用String方式拼接字符串,编译器使用StringBuilder,因此,用例1和用例2的效率是一样的。第二组和第二组的结果,是大家喜闻乐见的。由于10_000_000循环String拼接太慢,我用10_000拼接进行分析。分析用例3:虽然编译器会优化String拼接,但是每次都会在循环中创建一个StringBuilder对象,并在循环中销毁。他必须创造下一个周期。与用例4的循环外创建相比,new对象和对象销毁的操作多了n次,StringBuilder转String的操作多了n-1次。低效率是有道理的。还有一种方法可以扩展第一组的测试:/***在循环中使用StringBuilder拼接字符串,循环结束后销毁*/publicstaticvoiduseStringBuilderOut(){StringBuildersb=newStringBuilder();for(inti=0;i