对比背景

  • 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不同方法性能耗时对比的更多相关文章

  1. 关于JAVA中的String的使用与连接(转)

    JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable).           String的不可变性是Ja ...

  2. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  3. Java中测试StringBuilder、StringBuffer、String在字符串拼接上的性能

    应一个大量字符串拼接的任务 测试一下StringBuilder.StringBuffer.String在操作字符串拼接时候的性能 性能上理论是StringBuilder  >  StringBu ...

  4. 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...

  5. 为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接

    字符串,是Java中最常用的一个数据类型了.关于字符串的知识,作者已经发表过几篇文章介绍过很多,如: Java 7 源码学习系列(一)--String 该如何创建字符串,使用" " ...

  6. Golang中string和[]byte的对比

    golang string和[]byte的对比 为啥string和[]byte类型转换需要一定的代价? 为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) i ...

  7. .Net 中的 string、String、StringBuffer 内存处理性能 和 应用场景

    body { font-family: Segoe UI, SegoeUI, Helvetica Neue, Helvetica, Arial, sans-serif } code { color: ...

  8. Java中String连接性能的分析【转】

    [转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...

  9. 不建议在for循环中使用”+”进行字符串拼接

    https://mp.weixin.qq.com/s/qG6bdhndAip9s-_XM9oP3A 为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接 互联网后端架构 1周前    

  10. Java中String连接性能的分析

    总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个String ...

随机推荐

  1. Linux命令lsscsi详解

    @ 目录 一.什么是scsi 二.常见硬盘接口 1. IDE接口的硬盘 2. SCSI接口硬盘 3. SATA接口类型 三. lsscsi命令 1. lsscsi 命令安装 2. lsscsi命令英文 ...

  2. 工作常用SQL

    工作常用SQL Excel生成SQL 这个好用 ="insert into t_gk_mapping(id,gk_project_name,gk_project_code,main_proj ...

  3. Sql语句的两表联合查询

    string sql = "select mID,mName,mSex,mAge,(select fzName from TxlFenZu where ID=mFenZu) as mFenZ ...

  4. Node.js开发博客项目笔记-初始化路由(博客列表、新增、更新、删除、详情、登录)(3)

    工程目录 如图所示,工程目录如下: 我们在工程下新建src的目录,src目录下新建三个文件夹: controller:交互数据放到该目录下: model:model类放到该目录下: router:路由 ...

  5. DOM – Event Listener (bubble, capture, passive, custom event)

    前言 老掉牙的东西, 主要是想写 passive, 随便也写一点 bubble, capture 和 custom event 吧. Bubble Dom 监听事件是会冒泡的. 什么意思 ? 上图有 ...

  6. Blazor静态服务端呈现(静态SSR)身份认证

    本文介绍 Blazor 静态服务端呈现(静态 SSR)模式下,用户登录身份认证是如何实现的. 1. SSR 简介 SSR 是服务器侧呈现,HTML 是由服务器上的 ASP.NET Core 运行时生成 ...

  7. 揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证

    揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证 介绍 JWT(JSON Web Tokens)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在网络上安全地传输信息. ...

  8. JavaScript——案例-表单验证

    需求       <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. 暑集假训SCP提高拟模21

    \[だから妄想感傷代償連盟 \] \[愛を懐いて理想を叫んだ \] \[行き場のない愚者のメロディー \] \[再挑戦•転生•テレポーテーション \] \[何回だって 重ねて逝くんだ \] \[終わり ...

  10. Windows系统无法打开‘’网络发现‘’功能

    Windows10无法开启网络发现 解决办法: 1. services.msc 2. 开启 SSDP Discovery ,设置 启动类型为 自动 ,服务状态为 启动 Windows7 无法开启网络发 ...