一、使用+连接字符串的底层原理
我们先来看看这样一段代码
public class Main {
public static void main(String[] args) {
String mango = "mango";
String s = "abc" + mango + "def" + 47;
System.out.println(s);
}
}
我们用jdk自带的工具javap来反编译以上代码:
javap -c Main
这里的c代表生成字节码,生成的字节码如下所示:
![在
由以上字节码我们可以看出,首先根据“abc”字符串调用StringBuilder的构造函数生成一个StringBuilder对象,再依次调用StringBuilder类的append方法来实现字符串的连接,最后调用StringBuilder的toString方法将StringBuilder对象转化为String对象赋值给s,所以理论上来说在这种情形下用+连接字符串和用StringBuilder的append方法来连接字符串是差不多的。
二、循环情形下的+连接和append连接的区别
public String useAdd(String[] params){
String result = "";
for(int i=0;i<params.length;i++){
result = result + params[i];
}
return result;
}
public String useAppend(String[] params){
StringBuilder sb = new StringBuilder();
for(int i=0;i<params.length;i++){
sb.append(params[i]);
}
return sb.toString();
}
先来看看useAdd方法的字节码:
可以看出,第五行到第三十五行构成了一个循环体,也就是说每经过一次循环都需要新建一个StringBuilder对象,而原来的StringBuilder对象则成为了垃圾,等待垃圾回收器的回收,但是垃圾回收机制是周期性运行的,也就是说当循环量较大时会造成大量的内存消耗,使得程序的性能降低
再来看看useAppend方法的字节码,该方法只使用了StringBuilder类的append方法来进行字符串的连接操作
第十行和第27行之间构成了一个循环体,而StringBuilder对象的创建在第四行,也就是说这种方法不会重复创建StringBuilder对象,不存在+连接字符串而带来的内存消耗问题。
当用循环体连接字符串最好不要用+,用StringBuilder或许是一种更好的选择,这就是两者的区别啦!!!觉得有道理的点个赞呗。