zoukankan      html  css  js  c++  java
  • Java中字符串连接符(+)和append的区别

    参考链接:https://www.jianshu.com/p/849f1d443b3a

    文章结构:

      第一部分:对+的原理进行分析

      第二部分:+ 和 append 循环对比(贴出代码,以及分别循环后的反编译字节码,来对两者进行对比)

    一: + 底层原理解析(+ 的底层是new StringBuilder 进行append)

    1 String str1 = "hello";
    2 String str2 = str1 + " coisini";
    3 System.out.println(str2);

    底层,其实在每一次 + 之前 都会new 一个StringBuilder对象,所以效率低,

    上述代码,会被编译器按照如下顺序执行

      (使用javap -c 命令查看指令集,参考文章:https://www.cnblogs.com/coisini/p/9779283.html)

    具体指令详解参考上一篇

    https://www.cnblogs.com/coisini/p/9789412.html

    二: + 和 append 循环对比 

      1):+ 号循环

    1  long start = System.currentTimeMillis();
    2 String str1 = "hello";
    3 for(int i=0; i <10000000; i++){
    4      String str2 = str1 + " coisini";
    5 }
    6 long end = System.currentTimeMillis();
    7 System.out.println("开始-结束时间差"+(end-start));

    循环次数少,用 + 和append 结果没差,为了对比结果,所以我循环次数多一点,这里没考虑堆栈溢出的问题,看,用了2.34秒

    看一下反编译的字节码

      2)append做循环

    long start = System.currentTimeMillis();
    String str1 = "hello";
    StringBuilder builder= new StringBuilder();
    for(int i=0; i <10000000; i++){
          builder.append("coisni");
    }
    long end = System.currentTimeMillis();
    System.out.println("开始-结束时间差"+(end-start));

    反编译字节码,发现没,根本没有新创建对象

    总结

     1): +的原理,每遇到一个+,就new StringBuilder然后用append

     2):性能,字符串拼接少,两者均可,拼接次数多,用append

    生怕自己少截个图,会给阅读者,阅读造成麻烦,所以就啰嗦了点...

  • 相关阅读:
    Linux动态链接(4)ldd与ldconfig
    Linux动态链接(3)so文件映射地址
    Linux动态链接(2)so初始化执行
    Linux动态链接(1)惰性链接
    kill信号由谁接收处理
    gdb调试器之"测不准原则"
    gdb动态库延迟断点及线程/进程创建相关事件处理(下)
    gdb动态库延迟断点及线程/进程创建相关事件处理(上)
    Redis集群,备份,哨兵机制
    hyper-v虚拟机centos7网络配置
  • 原文地址:https://www.cnblogs.com/coisini/p/9778892.html
Copyright © 2011-2022 走看看