Java代码中字符串拼接方式有哪些
这篇文章主要为大家展示了“Java代码中字符串拼接方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java代码中字符串拼接方式有哪些”这篇文章吧。
分析过程环境系统: windows 10 21H1
JDK: OpenJDK 1.8.0_302
分析用示例代码:@Slf4jpublicclassStringConcat{@SneakyThrowspublicstaticvoidmain(String[]args){log.info("java虚拟机预热开始");String[]strs=newString[6000000];for(inti=0;i<strs.length;i++){strs[i]=id();}loopStringJoiner(strs);loopStringJoin(strs);loopStringBuilder(strs);log.info("java虚拟机预热结束");Thread.sleep(1000);log.info("开始测试:");Thread.sleep(1000);StopwatchstopwatchLoopPlus=Stopwatch.createStarted();//loopPlus(strs);log.info("loop-plus:"+stopwatchLoopPlus.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchLoopStringBuilderCapacity=Stopwatch.createStarted();loopStringBuilderCapacity(strs);log.info("loop-stringBuilderCapacity:"+stopwatchLoopStringBuilderCapacity.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchLoopStringBuilder=Stopwatch.createStarted();loopStringBuilder(strs);log.info("loop-stringBuilder:"+stopwatchLoopStringBuilder.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchLoopJoin=Stopwatch.createStarted();loopStringJoin(strs);log.info("loop-String.join:"+stopwatchLoopJoin.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchLoopStringJoiner=Stopwatch.createStarted();loopStringJoiner(strs);log.info("loop-stringJoiner:"+stopwatchLoopStringJoiner.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchSimplePlus=Stopwatch.createStarted();for(inti=0;i<500000;i++){simplePlus(id(),id(),id());}log.info("simple-Plus:"+stopwatchSimplePlus.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchSimpleStringBuilder=Stopwatch.createStarted();for(inti=0;i<500000;i++){simpleStringBuilder(id(),id(),id());}log.info("simple-StringBuilder:"+stopwatchSimpleStringBuilder.elapsed(TimeUnit.MILLISECONDS));Thread.sleep(1000);StopwatchstopwatchSimpleStringBuffer=Stopwatch.createStarted();for(inti=0;i<500000;i++){simpleStringBuffer(id(),id(),id());}log.info("simple-StringBuffer:"+stopwatchSimpleStringBuffer.elapsed(TimeUnit.MILLISECONDS));}privatestaticStringloopPlus(String[]strs){Stringstr="";for(Strings:strs){str=str+"+"+s;}returnstr;}privatestaticStringloopStringBuilder(String[]strs){StringBuilderstr=newStringBuilder();for(Strings:strs){str.append("+");str.append(s);}returnstr.toString();}privatestaticStringloopStringBuilderCapacity(String[]strs){StringBuilderstr=newStringBuilder(strs[0].length()*strs.length);for(Strings:strs){str.append("+");str.append(s);}returnstr.toString();}privatestaticStringloopStringJoin(String[]strs){StringJoinerjoiner=newStringJoiner("+");for(Stringstr:strs){joiner.add(str);}returnjoiner.toString();}privatestaticStringloopStringJoiner(String[]strs){returnString.join("+",strs);}privatestaticStringsimplePlus(Stringa,Stringb,Stringc){returna+"+"+b+"+"+c;}privatestaticStringsimpleStringBuilder(Stringa,Stringb,Stringc){StringBuilderbuilder=newStringBuilder();builder.append(a);builder.append("+");builder.append(b);builder.append("+");builder.append(c);returnbuilder.toString();}privatestaticStringsimpleStringBuffer(Stringa,Stringb,Stringc){StringBufferbuffer=newStringBuffer();buffer.append(a);buffer.append("+");buffer.append(b);buffer.append("+");buffer.append(c);returnbuffer.toString();}privatestaticStringid(){returnUUID.randomUUID().toString();}}
结果及总结
- java虚拟机预热开始
- java虚拟机预热结束
- 开始测试:
- loop-plus: 执行超时
- loop-stringBuilderCapacity: 285
- loop-stringBuilder: 1968
- loop-String.join: 1313
- loop-stringJoiner: 1238
- simple-Plus: 812
- simple-StringBuilder: 840
- simple-StringBuffer: 857
多次测试,可发现在字符串循环拼接场景下,直接使用“+”号性能最低,有初始容量的StringBuilder性能最高,其他方式性能均没有太大差异。
多次测试,可发现在字符串简单拼接场景下,使用“+”号、StringBuilder、StringBuffer性能差距在5%左右,可理解为测试误差,可认为三种方式性能一致。
代码及结果分析1. StringBuilder与StringBuffer对比
在无争抢共享资源的场景下,JVM会使用偏向锁等方法优化,甚至会进行锁消除,使用Synchronized关键词与否,性能并无明显差异。
2. 字节码分析
对比上述#simplePlus和#simpleStringBuilder两个方法的字节码,可明显看到两方法执行内容基本一致,但是直接使用"+"号时处理流程更短,可见编译器进行了深度优化,使用优化后的字节码理论上会有更高的性能:
//accessflags0xAprivatestaticsimplePlus(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;//parametera//parameterb//parametercL0LINENUMBER125L0NEWjava/lang/StringBuilderDUPINVOKESPECIALjava/lang/StringBuilder.<init>()VALOAD0INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;LDC"+"INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;ALOAD1INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;LDC"+"INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;ALOAD2INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;INVOKEVIRTUALjava/lang/StringBuilder.toString()Ljava/lang/String;ARETURNL1LOCALVARIABLEaLjava/lang/String;L0L10LOCALVARIABLEbLjava/lang/String;L0L11LOCALVARIABLEcLjava/lang/String;L0L12MAXSTACK=2MAXLOCALS=3//accessflags0xAprivatestaticsimpleStringBuilder(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;//parametera//parameterb//parametercL0LINENUMBER129L0NEWjava/lang/StringBuilderDUPINVOKESPECIALjava/lang/StringBuilder.<init>()VASTORE3L1LINENUMBER130L1ALOAD3ALOAD0INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;POPL2LINENUMBER131L2ALOAD3LDC"+"INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;POPL3LINENUMBER132L3ALOAD3ALOAD1INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;POPL4LINENUMBER133L4ALOAD3LDC"+"INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;POPL5LINENUMBER134L5ALOAD3ALOAD2INVOKEVIRTUALjava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;POPL6LINENUMBER135L6ALOAD3INVOKEVIRTUALjava/lang/StringBuilder.toString()Ljava/lang/String;ARETURNL7LOCALVARIABLEaLjava/lang/String;L0L70LOCALVARIABLEbLjava/lang/String;L0L71LOCALVARIABLEcLjava/lang/String;L0L72LOCALVARIABLEbuilderLjava/lang/StringBuilder;L1L73MAXSTACK=2MAXLOCALS=4
以上是“Java代码中字符串拼接方式有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。