StringBuilder 不支持零拷贝文本裁剪,其底层基于数组而非指针,所有裁剪操作均涉及数据拷贝;substring 等方法在 JDK 7u6 后显式复制字符,subSequence 仅提供逻辑视图且修改原对象会导致行为未定义。

StringBuilder 在 Java 中并不使用底层指针移动实现“零拷贝”文本裁剪,它也没有真正的零拷贝机制。
StringBuilder 底层没有指针操作
Java 运行在 JVM 上,不暴露内存地址或原生指针(除非用 Unsafe,但 StringBuilder 并未使用)。它的内部用 char[](JDK 8)或 byte[](JDK 9+,配合 coder 字段支持 Latin-1)存储字符,所有操作都是数组索引访问,属于普通数组复制或覆盖,不是指针偏移。
substring 等裁剪操作实际会拷贝数据
比如调用 subSequence(start, end) 或 substring(start, end)(后者返回 String),都会创建新对象:
-
subSequence返回的是一个StringBuffer.SubSequence(实际是内部包装类),但它仍基于原数组 + 起止偏移——但这只是逻辑视图,不是零拷贝共享;一旦你对原 StringBuilder 修改,该子序列可能失效(JDK 文档明确说明其行为“未定义”); -
substring方法返回 String,而 String 构造时在 JDK 7u6 之后已不再共享底层数组,而是显式复制对应范围的字符,即必然发生拷贝。
所谓“零拷贝”在 Java 字符串处理中基本不存在
零拷贝通常指操作系统层面绕过用户态内存拷贝(如 sendfile、DirectByteBuffer 配合 NIO)。Java 的 String 和 StringBuilder 均工作在堆内存,所有截取、反转、插入等操作都涉及数组读写,无法规避数据搬移。即使使用 Arrays.copyOfRange 或 System.arraycopy,也只是更高效的拷贝,不是零拷贝。
立即学习“Java免费学习笔记(深入)”;
如果真想减少拷贝,可考虑替代方案
若高频做区间裁剪且关注性能:
- 用
CharBuffer.wrap(char[])+slice(),它返回共享底层数组的新缓冲区,偏移和 limit 变化不触发拷贝(但要注意生命周期和线程安全); - 用
java.nio.CharBuffer或自定义只读视图类,手动维护 offset/length,避免构造新字符串; - 对于日志、模板拼接等场景,优先用
String.format或模板引擎延迟生成,而非反复裁剪 StringBuilder。
不复杂但容易忽略:StringBuilder 的设计目标是高效拼接,不是内存视图管理。裁剪不是它的强项,需要零拷贝语义时,应换用更底层的 NIO 工具或自定义不可变切片结构。


















