讲师中心 微信公众号
AI工具推荐 视频效率加速

探究StringBuilder扩容机制与数组拷贝的性能成本

秋浩姑娘_9199

秋浩姑娘_9199

发布时间:2026-04-04 09:19:32

|

512人浏览过

|

来源于php中文网

原创

StringBuilder扩容时因System.arraycopy拷贝旧数组内容导致性能开销,触发条件为count+新增字符数>capacity,扩容公式为newCapacity=oldCapacity×2+2,预设容量可避免拷贝。

探究stringbuilder扩容机制与数组拷贝的性能成本

StringBuilder扩容时会触发数组拷贝,这是其性能开销的主要来源——不是每次append都慢,而是扩容那一刻代价集中。

扩容触发条件很明确

StringBuilder内部维护一个char[]数组和一个记录当前长度的count字段。当执行append等修改操作时,如果新内容写入后会超出当前数组容量(即 count + 新增字符数 > capacity),就会触发扩容。

  • 默认初始容量是16,空构造器创建的对象第一次扩容就到34(16×2+2)
  • 后续扩容公式为:newCapacity = oldCapacity × 2 + 2,直到足够容纳新数据
  • 扩容不是“加16”,也不是按需精确分配,而是成倍增长,避免频繁重分配

数组拷贝是真正的性能瓶颈

扩容本身不耗时,真正花时间的是System.arraycopy()把旧数组内容复制到新数组。这个操作是O(n)时间复杂度,且涉及内存分配与连续块拷贝。

  • 拷贝量取决于当前已存字符数(count),不是容量(capacity)
  • 例如:已有3000个字符,数组容量3200,append 300个字符 → 触发扩容 → 拷贝3000个char → 分配新数组 → 再写入300个
  • 若提前预估容量(如new StringBuilder(5000)),可完全规避这次拷贝

如何观察和验证扩容行为

可通过反射或JDK9+的Unsafe方式读取StringBuilder的value字段(char[])和capacity,但更实用的是用JMH做微基准测试对比。

  • 写两个测试:一个用默认构造,一个指定足够容量,相同字符串拼接逻辑
  • 差异显著时(尤其在循环拼接场景),主要归因于数组拷贝次数减少
  • 配合-XX:+PrintGCDetails或JFR可发现大量临时char[]对象分配,侧面印证扩容频次

实际编码中的优化建议

多数情况下无需过度优化,但在高频拼接、确定长度范围或批量处理文本时,预设容量能带来稳定收益。

  • 知道大致长度:new StringBuilder(expectedLength)
  • 拼接固定集合(如List):先sum所有字符串length,再+少量余量
  • 避免在循环内反复创建StringBuilder:复用实例比每次都new更省
  • 超大文本拼接(MB级):考虑StringJoiner、BufferedWriter或流式处理,而非单个StringBuilder
数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2568

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1578

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2344

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5844

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5009

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

6734

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

9174

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

4659

2025.07.29

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn