
本文解析 stringbuilder 构造时“初始容量”与“当前长度”的本质区别,指出因混淆二者导致循环未执行的典型错误,并提供修复后的交替合并字符串完整实现。
本文解析 stringbuilder 构造时“初始容量”与“当前长度”的本质区别,指出因混淆二者导致循环未执行的典型错误,并提供修复后的交替合并字符串完整实现。
在 Java 中,StringBuilder 的构造参数指定的是初始容量(capacity),而非字符串内容长度(length)。这是本例中程序输出空字符串 "" 的根本原因。
看关键代码段:
int length = word1.length() + word2.length();
StringBuilder ans = new StringBuilder(length); // ← 仅设置内部数组初始大小!
System.out.println(ans.length()); // 输出:0(不是 length!)
while(current <p>ans.length() 返回的是当前已写入的字符数(初始为 0),而 new StringBuilder(42) 只是预分配一个能容纳至少 42 个字符的内部 char 数组——它不改变逻辑长度。因此 while(current </p><p>✅ 正确解法应基于<strong>实际待处理的字符数量</strong>控制循环,而非 StringBuilder 的长度。推荐两种清晰思路:</p><p><strong>方案一:按索引遍历两个字符串(推荐)</strong></p><pre class="brush:php;toolbar:false;">public String mergeAlternately(String word1, String word2) {
StringBuilder ans = new StringBuilder(word1.length() + word2.length());
int i = 0, j = 0;
while (i <p><strong>方案二:使用 for 循环 + 边界判断</strong></p><pre class="brush:php;toolbar:false;">public String mergeAlternately(String word1, String word2) {
StringBuilder ans = new StringBuilder(word1.length() + word2.length());
int maxLen = Math.max(word1.length(), word2.length());
for (int k = 0; k <p>? <strong>注意事项:</strong> </p>
- ✅ 始终用 string.length() 判断字符串边界,而非 StringBuilder.length() 控制主循环;
- ✅ 预设容量(如 new StringBuilder(n))仅为性能优化(减少扩容次数),不影响逻辑行为;
- ⚠️ 若需处理 Unicode 补充字符(如 emoji),应避免 char 和 charAt(),改用 codePointAt() 和 String#codePoints() 流式处理——但本题约束为 ASCII 字母,charAt() 安全可用;
- ✅ 单元测试验证:mergeAlternately("abc", "pqr") → "apbqcr";mergeAlternately("ab", "pqrs") → "apbqrs"。
总结:理解 capacity ≠ length 是安全使用 StringBuilder 的第一课。将循环条件锚定在输入源(word1.length() / word2.length())上,才能写出健壮、可读、零隐藏 bug 的字符串操作代码。










