本帖最后由 Cyborg 于 2018-4-3 14:06 编辑
一般认为,字符串拼接速度,StringBuilder > StringBuffer > String
但真的任何时候都需要用“append”代替“+”?显然不是。 String ≈ StringBuilder如果只是定义String时拼接变量,此时两者速度相差不大,可以直接使用“+”。
考虑以下语句: [Java] 纯文本查看 复制代码 String str = "abc";
String str1 = str + "def";
String str2 = new StringBuilder().append(str).append("def").toString(); 生成str1的速度和生成str2的速度相当。 原因通过反编译可以发现,做“+”操作时,编译器实际上也定义了StringBuilder并调用append方法进行字符串拼接,因此这种情况下,两者的速度相当。(显式调用StringBuilder可以减少一次append调用) String < StringBuilder虽然编译器会帮我们定义StringBuilder,但它没有这么聪明。
考虑以下语句: [Java] 纯文本查看 复制代码 String str = "";
for (int i = 0; i < 1000; i++) {
str += "abcde";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
stringBuilder.append("abcde");
} 使用StringBuilder更快。 原因在循环中,每执行一次“+”,都会创建一个StringBuilder对象,因此会有大量对象创建和回收的消耗。
简单来说,在循环中对同一个字符串对象做字符串拼接,优先选择StringBuilder
String > StringBuilder如果只是用于多个常量的拼接(例如某些SQL语句的拼接),那么String的速度会比StringBuilder快。
考虑以下语句: [Java] 纯文本查看 复制代码 String str1 = "abc" + "def" + "ghi";
String str2 = new StringBuilder("abc").append("def").append("ghi").toString(); 生成str1的速度会比生成str2快,append的字符串越长,速度相差越大。 原因通过对代码进行反编译,可以看到定义str1时,编译器做了优化,直接定义了常量”abcdefghi”,没有创建额外的对象。而定义str2时,调用了多次append方法,导致速度较慢。 备注如果拼接的包含非常量,那么String拼接时,编译器也会生成StringBuilder并多次调用append方法,此时两者速度相近。 总结大多数情况下,使用StringBuilder进行字符串拼接,确实比String速度快。但大家一定要了解其中的原因,不要盲目地把全部的“+”变成“append”。
如果只是把多个变量拼接在一起定义成字符串(例如SQL语句定义、服务器域名拼接等等),这时候用“+”可读性会更好,代码也会更简洁,而效率相差无几。 |