1)代码:
public static String s1() {
String result = "";
result += "A";
result += "B";
result += "C";
return result;
}
public static String s2() {
String result = "";
result = "A" + "B" + "C";
return result;
}
public static String s3() {
StringBuilder result = new StringBuilder();
result.append("A").append("B").append("C");
return result.toString();
}
2)结论:性能上s2 > s3 > s1
3)分析:
Javap查看字节码:
由上图可知:
s1方法:3次创建StringBuilder对象,6次调用append方法添加字符串,3次调用toString方法把添加后的结果返回给result,三者之中,性能最差。
s2方法:编译器对“+”进行优化,合并"A"+"B"+"C"为“ABC”,直接赋给result,三者之中,性能最好。
s3方法:1次创建StringBuilder对象,3次调用append方法添加字符串,1次调用toString方法把添加后的结果返回给result,三者之中,性能居中。
4)总结:
- 在做字符串的连接操作时,append方法未必是最好的。
- 等号右侧有变量参与的字符串“+”操作(例如:result += "A"),jvm在做连接时,是创建一个新的StringBuilder对象,然后使用其append方法来实现连接,等号右侧没有变量参与的字符串“+”操作(例如:result = "A" + "B" + "C"),jvm在做连接时,会对右侧的连接操作进行优化,将其合并成一个字符串,然后赋给左边的变量,此时就变成了一次简单的赋值过程。
5)补充
5.1)代码:
public static String s4() {
String result = "";
result = result + "A" + "D";
return result;
}
public static String s5() {
String result = "";
result += "A" + "D";
return result;
}
5.2)分析:
Javap查看字节码:
由上图可知:
s4方法:1次创建StringBuilder对象,3次调用append方法添加字符串(A和D各占一次),1次调用toString方法把添加后的结果返回给result。
s5方法:1次创建StringBuilder对象,2次调用append方法添加字符串(A和D经优化变成AD,所以A和D加起来仅占一次),1次调用toString方法把添加后的结果返回给result。
5.3)总结:
- s4和s5中等号右侧都有变量参于进行字符串的“+”操作(result),所以都会创建StringBuilder对象,并使用其append方法实现连接。
- s4中使用的是“=”,所以等号右侧显式的指出了result变量参与字符串的“+”操作,在这种情况下,A和D分两次append完成,而s5中使用的是“+=”,所以等号右侧隐式的指出了result变量参与字符串的“+”操作,在这种情况下,A、D合并成AD,一次append完成。