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
 
 
 
 
 
 
 
 
 
 

原文地址:https://www.cnblogs.com/xiexiaofei/p/14121457.html