zoukankan      html  css  js  c++  java
  • String与“+”的拼接之创建了几个对象

    当我们写了一段String拼接的代码后
      String s = "abc";
      String ss = "bcd"+s+"def"+5;
      System.out.println(ss);
    我们通过jad反编译查看

     

    系统帮我们做了优化,创建了一个StringBuilder对象然后进行了append的拼接,但是StringBuilder会调用父类AbstractStringBuilder,AbstractStringBuilder会创建一个char[]数组,并且toString()会创建一个String对象

    也就是外部拼接的话,并且拼接的包含变量,不光是字面量的话会调用StringBuilder进行优化,创建三个对象
     
    当我们都用String拼接字面量的时候
    String s = "a" + "b" + "c" + "d" + "e";
    System.out.println(s);
    通过jad反编译查看
    这段代码只会在常量池中创建一个"abcde"的对象,如果常量池中存在"abcde"这个对象,则直接共用一个内存,不会创建对象,可以节省内存

     
    但是当我们在循环体中进行String的拼接
        String a = "0";
        for (int i = 1; i < 10; i++) {
            a = a + "M";
        }
        System.out.println(a);
    我们通过jad反编译class查看
    会在循环体中创建一个StringBuilder对象,调用super(16),传一个初始长度为16的数组,也就是父类构造函数会创建一个char[]数组对象,toString()创建一个String对象
    所以这段代码会创建 循环次数*3的对象-> 30个对象
     
    总结:
    所以,当我们在循环体中进行String拼接的时候,我们应该使用StringBuilder来进行append拼接,避免使用String,减少对象的创建

     参考:https://blog.csdn.net/java2000_net/article/details/3681385
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    Bootstrap标签(label)的使用
    Docker学习(二)
    linux 的tee命令
    解决 Docker pull 出现的net/http: TLS handshake timeout 的一个办法
    win 10 安装.msi 程序出现the error code is 2503
    Kbuntu16.04利用快捷键调用终端Konsole
    ubuntu上swift开发学习2
    ubuntu上swift开发学习1
    Linux中常用文件传输命令及使用方法
    Kbuntu16.04添加工作空间
  • 原文地址:https://www.cnblogs.com/xiexiaofei/p/14121457.html
Copyright © 2011-2022 走看看