[JAVA]浅谈String, StringBuilder字符串拼接速度

来源:互联网 发布:淘宝情趣用品类目 编辑:程序博客网 时间:2024/04/26 14:32

一般认为,字符串拼接速度,StringBuilder > StringBuffer > String
但真的任何时候都需要用“append”代替“+”?显然不是。


StringStringBuilder

如果只是定义String时拼接变量,此时两者速度相差不大,可以直接使用“+”。
考虑以下语句:

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,但它没有这么聪明。
考虑以下语句:

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快。
考虑以下语句:

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 0
原创粉丝点击