对比背景

  • 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. 11. 基于ARM Cortex-A9中断详解

    一.中断概念 操作系统中,中断是很重要的组成部分.出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行. 有了中断系统才可以不用一直 ...

  2. Atcoder ABC364 D-F

    Atcoder ABC364 D-F D - K-th Nearest 链接: D - K-th Nearest (atcoder.jp) 简要题意: 问题陈述 在一条数线上有 \(N+Q\) 个点 ...

  3. 基于surging的产品项目-木舟开源了!

    一 . 概述 因为前段时间电脑坏了,导致代码遗失,踌躇满志马上上线的平台产品付之东流,现在熬夜在写代码希望能尽快推出企业正常使用的平台产品,而这次把代码开源,一是让大家对surging 使用有个深入的 ...

  4. 能否自定义一个String类使用

    先说下结论,可以自定义包名不为java.lang的String类,区别包名是可以正常使用的. 包名不为java.lang package com.seven.jvm; public final cla ...

  5. 【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?

    问题描述 使用标准版的Azure Logic App服务,可以创建多个工作流(workflow),如果在启用/禁用其它的工作流时,是否会对正在运行其它工作流造成影响呢? 问题解答 在实际的测验中,我们 ...

  6. 使用 Portainer CE 管理远程主机的 Docker

    Prerequisites 你已经在本地主机安装了 Portainer CE 安装 打开本地主机的 Portainer CE 界面,默认地址为 localhost:9443 在左侧边栏中找到 Envi ...

  7. cesium的使用

    安装 建议使用vue的cesium插件:vue-cli-plugin-cesium.vue add命令可零配置添加cesium:vue add vue-cli-plugin-cesium 报错 添加完 ...

  8. c程序设计语言 by K&R(四)输入与输出

    一.标准输入.输出 1. 简单的输入\输出机制 从标准输入中一次读取一个字符:int getchar(void) 将字符c送到标准输出中: int putchar(int) 2. 输入重定向 如果程序 ...

  9. KernelWarehouse:英特尔开源轻量级涨点神器,动态卷积核突破100+ | ICML 2024

    动态卷积学习n个静态卷积核的线性混合,加权使用它们输入相关的注意力,表现出比普通卷积更优越的性能.然而,它将卷积参数的数量增加了n倍,因此并不是参数高效的.这导致不能探索n>100的设置(比典型 ...

  10. python学习教材选哪个

    python语言俨然成为当今最流行的国际语言,无论你是做AI的还是非AI,大家都在用python语言,各种平台也都开始支持python,现在连文科生都在学习python语言了,甚至很多表哥表姐的工作都 ...