
本文解析 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 < ans.length()) { // ← 条件恒为 false:0 < 0 → false
// ... 循环体完全不会执行
}ans.length() 返回的是当前已写入的字符数(初始为 0),而 new StringBuilder(42) 只是预分配一个能容纳至少 42 个字符的内部 char 数组——它不改变逻辑长度。因此 while(current
✅ 正确解法应基于实际待处理的字符数量控制循环,而非 StringBuilder 的长度。推荐两种清晰思路:
方案一:按索引遍历两个字符串(推荐)
public String mergeAlternately(String word1, String word2) {
StringBuilder ans = new StringBuilder(word1.length() + word2.length());
int i = 0, j = 0;
while (i < word1.length() || j < word2.length()) {
if (i < word1.length()) {
ans.append(word1.charAt(i++));
}
if (j < word2.length()) {
ans.append(word2.charAt(j++));
}
}
return ans.toString();
}方案二:使用 for 循环 + 边界判断
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 < maxLen; k++) {
if (k < word1.length()) ans.append(word1.charAt(k));
if (k < word2.length()) ans.append(word2.charAt(k));
}
return ans.toString();
}? 注意事项:
- ✅ 始终用 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 的字符串操作代码。

















