文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java代码中字符串拼接方式有哪些

2023-06-29 04:12

关注

这篇文章主要为大家展示了“Java代码中字符串拼接方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java代码中字符串拼接方式有哪些”这篇文章吧。

分析过程

环境

分析用示例代码:

@Slf4jpublic class StringConcat {    @SneakyThrows    public static void main(String[] args) {        log.info("java虚拟机预热开始");        String[] strs = new String[6000000];        for (int i = 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);        Stopwatch stopwatchLoopPlus = Stopwatch.createStarted();//        loopPlus(strs);        log.info("loop-plus: " + stopwatchLoopPlus.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchLoopStringBuilderCapacity = Stopwatch.createStarted();        loopStringBuilderCapacity(strs);        log.info("loop-stringBuilderCapacity: " + stopwatchLoopStringBuilderCapacity.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchLoopStringBuilder = Stopwatch.createStarted();        loopStringBuilder(strs);        log.info("loop-stringBuilder: " + stopwatchLoopStringBuilder.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchLoopJoin = Stopwatch.createStarted();        loopStringJoin(strs);        log.info("loop-String.join: " + stopwatchLoopJoin.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchLoopStringJoiner = Stopwatch.createStarted();        loopStringJoiner(strs);        log.info("loop-stringJoiner: " + stopwatchLoopStringJoiner.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchSimplePlus = Stopwatch.createStarted();        for (int i = 0; i < 500000; i++) {            simplePlus(id(), id(), id());        }        log.info("simple-Plus: " + stopwatchSimplePlus.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchSimpleStringBuilder = Stopwatch.createStarted();        for (int i = 0; i < 500000; i++) {            simpleStringBuilder(id(), id(), id());        }        log.info("simple-StringBuilder: " + stopwatchSimpleStringBuilder.elapsed(TimeUnit.MILLISECONDS));        Thread.sleep(1000);        Stopwatch stopwatchSimpleStringBuffer = Stopwatch.createStarted();        for (int i = 0; i < 500000; i++) {            simpleStringBuffer(id(), id(), id());        }        log.info("simple-StringBuffer: " + stopwatchSimpleStringBuffer.elapsed(TimeUnit.MILLISECONDS));    }    private static String loopPlus(String[] strs) {        String str = "";        for (String s : strs) {            str = str + "+" + s;        }        return str;    }    private static String loopStringBuilder(String[] strs) {        StringBuilder str = new StringBuilder();        for (String s : strs) {            str.append("+");            str.append(s);        }        return str.toString();    }    private static String loopStringBuilderCapacity(String[] strs) {        StringBuilder str = new StringBuilder(strs[0].length() * strs.length);        for (String s : strs) {            str.append("+");            str.append(s);        }        return str.toString();    }    private static String loopStringJoin(String[] strs) {        StringJoiner joiner = new StringJoiner("+");        for (String str : strs) {            joiner.add(str);        }        return joiner.toString();    }    private static String loopStringJoiner(String[] strs) {        return String.join("+", strs);    }    private static String simplePlus(String a, String b, String c) {        return a + "+" + b + "+" + c;    }    private static String simpleStringBuilder(String a, String b, String c) {        StringBuilder builder = new StringBuilder();        builder.append(a);        builder.append("+");        builder.append(b);        builder.append("+");        builder.append(c);        return builder.toString();    }    private static String simpleStringBuffer(String a, String b, String c) {        StringBuffer buffer = new StringBuffer();        buffer.append(a);        buffer.append("+");        buffer.append(b);        buffer.append("+");        buffer.append(c);        return buffer.toString();    }    private static String id() {        return UUID.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与StringBuffer对比

在无争抢共享资源的场景下,JVM会使用偏向锁等方法优化,甚至会进行锁消除,使用Synchronized关键词与否,性能并无明显差异。

字节码分析

对比上述#simplePlus和#simpleStringBuilder两个方法的字节码,可明显看到两方法执行内容基本一致,但是直接使用"+"号时处理流程更短,可见编译器进行了深度优化,使用优化后的字节码理论上会有更高的性能:

  // access flags 0xA  private static simplePlus(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;    // parameter  a    // parameter  b    // parameter  c   L0    LINENUMBER 125 L0    NEW java/lang/StringBuilder    DUP    INVOKESPECIAL java/lang/StringBuilder.<init> ()V    ALOAD 0    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    LDC "+"    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    ALOAD 1    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    LDC "+"    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    ALOAD 2    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;    ARETURN   L1    LOCALVARIABLE a Ljava/lang/String; L0 L1 0    LOCALVARIABLE b Ljava/lang/String; L0 L1 1    LOCALVARIABLE c Ljava/lang/String; L0 L1 2    MAXSTACK = 2    MAXLOCALS = 3  // access flags 0xA  private static simpleStringBuilder(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;    // parameter  a    // parameter  b    // parameter  c   L0    LINENUMBER 129 L0    NEW java/lang/StringBuilder    DUP    INVOKESPECIAL java/lang/StringBuilder.<init> ()V    ASTORE 3   L1    LINENUMBER 130 L1    ALOAD 3    ALOAD 0    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    POP   L2    LINENUMBER 131 L2    ALOAD 3    LDC "+"    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    POP   L3    LINENUMBER 132 L3    ALOAD 3    ALOAD 1    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    POP   L4    LINENUMBER 133 L4    ALOAD 3    LDC "+"    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    POP   L5    LINENUMBER 134 L5    ALOAD 3    ALOAD 2    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;    POP   L6    LINENUMBER 135 L6    ALOAD 3    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;    ARETURN   L7    LOCALVARIABLE a Ljava/lang/String; L0 L7 0    LOCALVARIABLE b Ljava/lang/String; L0 L7 1    LOCALVARIABLE c Ljava/lang/String; L0 L7 2    LOCALVARIABLE builder Ljava/lang/StringBuilder; L1 L7 3    MAXSTACK = 2    MAXLOCALS = 4

以上是“Java代码中字符串拼接方式有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯