[JAVA]浅谈String, StringBuilder字符串拼接速度
来源:互联网 发布:淘宝情趣用品类目 编辑:程序博客网 时间:2024/04/26 14:32
一般认为,字符串拼接速度,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语句定义、服务器域名拼接等等),这时候用“+”可读性会更好,代码也会更简洁,而效率相差无几。
- [JAVA]浅谈String, StringBuilder字符串拼接速度
- StringBuilder String string.Concat 字符串拼接速度
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
- 【java】浅谈 Java 字符串(String, StringBuffer, StringBuilder)
- (5)java 字符串 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 浅谈java String,StringBuilder,StringBuffer
- java 字符串拼接为什么要用 StringBuilder 而不直接用 String 相加连接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- Java 中字符串拼接 String 和 StringBuilder(StringBuffer)的使用
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- JAVA 拼接字符串 加号问题 + StringBuilder/StringBuffer
- java字符串拼接技巧(StringBuilder使用技巧)
- java的string字符串拼接
- java的String字符串拼接和StringBuffer的append的速度差异
- spring ioc aop 的原理是什么?
- Oracle---数据泵(增强逻辑导入导出)
- MySQl学习笔记
- Qt 学习之路 2(66):访问网络(2)
- 程序员面试技巧
- [JAVA]浅谈String, StringBuilder字符串拼接速度
- V信全自动加粉工具(日加一万不是梦) 微信加粉一直手动绝对是老大难问题,本工作室推出强大的加粉工具版本(详细可通过演示视频了解) 1.支持真机模拟器 2.支持微信所有版本 3.支持自定义打招呼文本输
- [Python] Socket 局域网通讯
- 按钮
- JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation
- 单词
- NOIP提高组2010-2015初赛+模拟2
- MYSQL中int、bigint、smallint、tinyint这几种类型得区别
- 情绪与情感、发展与教育、人格与动机