Java 中使用 repeat() 方法拼接字符串时,若在待重复的子串末尾添加了空格,会导致最终结果比预期多出一个尾部空格,从而引发 equals() 比较失败——这是由字符串内容的严格字面匹配特性决定的。
java 中使用 `repeat()` 方法拼接字符串时,若在待重复的子串末尾添加了空格,会导致最终结果比预期多出一个尾部空格,从而引发 `equals()` 比较失败——这是由字符串内容的严格字面匹配特性决定的。
在 Java 11+ 中,String::repeat(int) 是一个便捷方法,但它会原样重复整个字符串,包括其中的空格。来看原始代码的问题根源:
String DRUM_R = "Bang Bang"; // 长度为 10("Bang" + 空格 + "Bang") String sound = "Bang"; String s = (sound + " ").repeat(2); // → "Bang Bang "(注意末尾空格!长度为 11) System.out.println(s.equals(DRUM_R)); // false —— 因为 "Bang Bang " ≠ "Bang Bang"
执行 (sound + " ").repeat(2) 实际等价于 "Bang " + "Bang ",结果是 "Bang Bang "(末尾带空格),而 DRUM_R 是 "Bang Bang"(无尾随空格)。二者虽在视觉上难以分辨,但 String.equals() 是逐字符精确比较,尾部空格导致哈希值与内容均不一致,故返回 false。
✅ 正确做法应避免将分隔符内嵌到被重复的单元中。以下是几种推荐方案:
1. 使用 String.join()(最简洁、语义清晰)
立即学习“Java免费学习笔记(深入)”;
String s = String.join(" ", sound, sound); // → "Bang Bang"
// 通用化:String.join(" ", Collections.nCopies(n, sound))2. 手动拼接(适合少量重复)
String s = sound + " " + sound; // → "Bang Bang"
3. 使用 StringBuilder 构建(高效、可控,推荐用于动态次数)
public static String repeatWithSpace(String word, int n) {
if (n <= 0) return "";
StringBuilder sb = new StringBuilder(word);
for (int i = 1; i < n; i++) {
sb.append(" ").append(word);
}
return sb.toString();
}
// 调用:repeatWithSpace("Bang", 2) → "Bang Bang"⚠️ 注意事项:
- ❌ 避免 (word + " ").repeat(n) —— 必然产生多余尾空格;
- ✅ 若坚持用 repeat(),需后处理裁剪:s = (sound + " ").repeat(2).stripTrailing()(Java 11+)或 .substring(0, s.length()-1)(仅当确定有且仅有一个尾空格时);
- ? 调试时务必打印 s.length() 和 s.chars().mapToObj(c -> c == ' ' ? "␣" : String.valueOf((char)c)).collect(Collectors.joining()) 辅助识别隐藏空格。
总结:字符串重复 ≠ 自动智能格式化。repeat() 是机械复制,分隔逻辑需显式设计。优先选用 String.join() 或 StringBuilder 方式,既语义明确,又杜绝空格歧义,确保相等性判断可靠、代码可维护性强。


















