A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Cyborg

初级黑马

  • 黑马币:20

  • 帖子:8

  • 精华:0

本帖最后由 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语句定义、服务器域名拼接等等),这时候用“+”可读性会更好,代码也会更简洁,而效率相差无几。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马