首页 > 编程知识 正文

java使得string拼接字符串,java字符串变量拼接字符

时间:2023-05-06 04:46:20 阅读:283098 作者:4054

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

String ≈ StringBuilder

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。