You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中StringBuilder的append方法工作原理及参数内存疑问

问题解析

首先看你给出的代码:

StringBuilder sb = new StringBuilder("mainWord");
sb.append("secondWord" + "thirdWord");
System.out.println(sb);

你的核心疑问可以从两个层面拆解:

  1. 编译期的字符串拼接优化
    "secondWord" + "thirdWord"这种两个字符串字面量的拼接操作,会被Java编译器在编译阶段直接优化成单个字符串字面量"secondWordthirdWord",完全不会在运行时执行拼接逻辑。这个字面量会被存入字符串常量池(Java 7及以后常量池位于堆内存的特殊区域,不属于普通堆对象的动态分配),且整个JVM进程中该常量只会存在一份。

  2. StringBuilder.append的底层逻辑
    当append方法接收这个字符串常量时,并不会将整个String对象存入自身结构,而是直接读取该String内部的字符数组(或字节数组,依Java版本而定),把其中的字符复制到自己内部可扩容的字符数组中。这个过程不会在堆上创建新的String对象,只是复用了常量池里已有的字符串常量,自然不会额外分配堆空间来存储这个拼接后的字符串——因为根本不需要单独存它,直接复制字符即可。

你之前的误区可能混淆了String操作的场景:只有运行时的动态字符串拼接(比如用变量拼接,str1 + str2中str1是动态变量),才会在运行时创建新的String对象并分配堆空间。而字面量拼接是编译期完成的,再加上append的直接复制逻辑,就不会产生额外的堆对象分配。

内容的提问来源于stack exchange,提问作者Rufat Rustamli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:27:02