循环中拼接String不同方法性能耗时对比

对比背景
- Java中最常用的拼接字符串方法就是 + 或 +=,使用上简单方便。但如果拼接数量比较大,例如在循环中拼接字符串,可能会有性能问题;
测试数据
- 循环100000次进行String拼接,对比+=和使用StringBuilder,StringBuffer。运行在JDK8,查看循环耗时时间
具体实现如下
- 使用+=进行拼接String
@Test
//使用+=进行拼接String
public void testCase1(){
String str = "";
long startTime= System.currentTimeMillis();
for (int i = 0;i< 100000;i++){
str += i;
}
long endTime= System.currentTimeMillis();
System.out.println(endTime-startTime);
}
- 使用StringBuilder
//使用StringBuilder
@Test
public void testCase2(){
StringBuilder stringBuilder = new StringBuilder();
long startTime= System.currentTimeMillis();
for (int i = 0 ; i< 100000;i++){
stringBuilder.append(i);
}
long endTime= System.currentTimeMillis();
System.out.println(endTime-startTime);
}
- 使用StringBuffer
//使用StringBuffer
@Test
public void testCase3(){
StringBuffer str = new StringBuffer();
long startTime= System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str.append(i);
}
long endTime= System.currentTimeMillis();
System.out.println(endTime-startTime);
}
执行结果对比

使用+=进行拼接String耗时(单位:毫秒):18301
使用StringBuilder耗时(单位:毫秒):5
使用StringBuffer耗时(单位:毫秒):6
原理分析
可以看到在上面的10w次循环拼接中,直接使用+=拼接的时间对比其他两个有近3600倍的差距,因为每次循环java都会自动创建一个StringBuilder用来做String拼接,然后转化为String赋值给str,造成了大量的对象创建开销,反编译代码如下

而使用StringBuilder和StringBuffer的情况性能上就好太多了,如果对总的字符串长度有一个基本的预期,可以在new的时候指定capacity以节省当空间不够时扩容的开销。
StringBuffer作为线程安全类,在以前性能是比较差的,因此才有了非线程安全的StringBuilder,但JDK1.6以后由于java对synchronized锁做了优化(偏向锁→ 轻量级锁→ 重量级锁),StringBuffer性能有了极大提升,但习惯性的在没有并发情况下,还是使用StringBuilder
解决方案
当有大量字符串拼接需要时,尤其是在循环中,考虑使用StringBuilder或StringBuffer
更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

循环中拼接String不同方法性能耗时对比的更多相关文章
- 关于JAVA中的String的使用与连接(转)
JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable). String的不可变性是Ja ...
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...
- Java中测试StringBuilder、StringBuffer、String在字符串拼接上的性能
应一个大量字符串拼接的任务 测试一下StringBuilder.StringBuffer.String在操作字符串拼接时候的性能 性能上理论是StringBuilder > StringBu ...
- 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...
- 为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接
字符串,是Java中最常用的一个数据类型了.关于字符串的知识,作者已经发表过几篇文章介绍过很多,如: Java 7 源码学习系列(一)--String 该如何创建字符串,使用" " ...
- Golang中string和[]byte的对比
golang string和[]byte的对比 为啥string和[]byte类型转换需要一定的代价? 为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) i ...
- .Net 中的 string、String、StringBuffer 内存处理性能 和 应用场景
body { font-family: Segoe UI, SegoeUI, Helvetica Neue, Helvetica, Arial, sans-serif } code { color: ...
- Java中String连接性能的分析【转】
[转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...
- 不建议在for循环中使用”+”进行字符串拼接
https://mp.weixin.qq.com/s/qG6bdhndAip9s-_XM9oP3A 为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接 互联网后端架构 1周前
- Java中String连接性能的分析
总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个String ...
随机推荐
- 开发一个MutatingWebhook
介绍 Webhook就是一种HTTP回调,用于在某种情况下执行某些动作,Webhook不是K8S独有的,很多场景下都可以进行Webhook,比如在提交完代码后调用一个Webhook自动构建docker ...
- uni-app 小程序用户信息之头像昵称填写
小程序获取用户头像昵称,微信又叒做妖,废除之前的接口,改成了头像昵称填写 通知:微信小程序端基础库2.27.1及以上版本,wx.getUserProfile 接口被收回,详见<小程序用户头像昵称 ...
- K8s文件解析 涉及 SLS、MSE、NAS存储卷等
k8s.yml模板 涉及配置: 1. 存储卷(NAS) 2. SLS设定(阿里云日志采集系统) 3. MSE配置(阿里云版nacos) 4. 配置应用参数(包括路径,布尔类型数据等) apiVersi ...
- 剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表. 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 .这篇文章,我们聊聊如何使用 List 命令实现消息队列 ...
- 音视频FAQ(三):音画不同步
摘要 本文介绍了音画不同步问题的五个因素:编码和封装阶段.网络传输阶段.播放器中的处理阶段.源内容产生的问题以及转码和编辑.针对这些因素,提出了相应的解决方案,如使用标准化工具.选择强大的传输协议.自 ...
- Angular 18+ 高级教程 – Component 组件 の Dynamic Component 动态组件
前言 Angular 是 MVVM 框架. MVVM 的宗旨是 "不要直接操作 DOM". 为了这个 "不要直接操作 DOM",我们已经讲了 2 篇文章了. 第 ...
- 大一下的acm生活
在一个名气不大的211学校刷题的日常. 感觉这些算法题好难啊! 最近有好多实验室要招新,不知道该怎么办,自己只想就业,并不想升学,好烦! 真枯燥,好无聊. 现在要学习相关的网页设计和网站建设,例如配色 ...
- 音视频入门-5-音频编码原理、编码器、ADTS格式
1. 概念 音频压缩技术指的是对原始数字音频信号流(PCM编码)运用的数字信号处理技术. 2. 背景 和 压缩的必要性 研究发现,直接采用PCM码流进行存储和传输存在非常大的冗余度. 以CD为例,其 ...
- 记录一次BOOST库相关的使用包含互斥量、条件变量的类,引发的编译报错
1. 工作中的代码: 2. 使用指针作为形参,不会造成编译报错,我是可以理解的. 那么请讨论下为什么使用值传递和引用作为形参,会造成编译报错? 3. 答案揭晓 boost 的mutex源码: 最终原因 ...
- Vue3——Vue Router
安装 vue-router 依赖包 npm install vue-router@4 创建 router 文件夹,然后在里面创建一个 index.ts 文件,用于定义你的路由配置 // index.t ...