string.repeat() 是 java 11 新增方法,低版本不支持;需确保 jdk/jre ≥ 11 并配置 maven source/target;java 8 可用 stringbuilder 或 collectors.joining() 安全替代。

String.repeat() 在 Java 11+ 中直接可用,但低版本会报错
Java 11 确实加了 String.repeat(int),但它不是“增强”,而是全新引入的 API。如果你用的是 Java 8、9 或 10,调用它会直接编译失败:java.lang.NoSuchMethodError 或编译器报 cannot find symbol。
常见错误现象:IDE 显示方法存在(因为用了高版本 JDK 编译),但运行时用低版本 JRE 就崩;或者 Maven 编译用的 source/target 是 11,但 CI 环境实际跑在 Java 8 上。
- 确认 JDK 版本:运行
java -version和javac -version,二者必须 ≥ 11 - Maven 要显式设
source和target为11,光靠 IDE 设置不保险 - Spring Boot 2.1+ 默认要求 Java 8+,但
repeat()不是 Spring 提供的,它只认底层 JDK
Java 8 怎么安全替代 String.repeat()
别手写 for 循环拼接——字符串不可变,每次 += 都新建对象,n 大时性能断崖下跌。推荐用 java.util.stream.Collectors.joining() 或 java.lang.StringBuilder。
最简实用方案:
立即学习“Java免费学习笔记(深入)”;
public static String repeat(String s, int n) {
if (n <= 0) return "";
if (s == null) s = "";
return new String(new char[n]).replace("\0", s);
}
这个 trick 利用了 new char[n] 初始化全 '
这个 trick 利用了 new char[n] 初始化全 '\0',再用 String.replace() 批量替换,JVM 对这种模式做了优化,比循环快得多,也比 Stream 更轻量。
String.replace() 批量替换,JVM 对这种模式做了优化,比循环快得多,也比 Stream 更轻量。- 注意
s为null时要兜底,否则replace()会抛NullPointerException -
n为负数或 0 必须提前返回,否则new char[-1]抛NegativeArraySizeException - 该写法在 Java 8–17 全兼容,且无额外依赖
repeat() 的边界行为和性能坑点
String.repeat(n) 行为很明确:n=0 返回空字符串,nIllegalArgumentException,内部用 Arrays.fill() + new String() 实现,比手写 StringBuilder 更稳。
但容易忽略两点:
- 重复超大次数(比如
n > Integer.MAX_VALUE / s.length())会触发OutOfMemoryError或StringIndexOutOfBoundsException,JVM 不会自动截断 - 如果
s是空字符串"",无论 n 多大都返回""——这和多数人直觉一致,但某些旧工具类(如 Apache Commons Lang 的StringUtils.repeat())对空串处理不同,混用时要注意 - 在高频日志拼接或模板渲染中,反复调用
repeat()可能成为 GC 压力源,建议对固定模式(如缩进 4 空格 × 10 层)做缓存
要不要升级到 Java 11 就为了 repeat()?
单为 repeat() 升级不值当。Java 11 的真正价值是长期支持(LTS)、ZGC、HTTP Client API、以及更严格的模块系统约束——这些才影响架构稳定性。
如果你的项目已锁定 Java 8(比如银行老系统、Android 旧构建链),用前面那个 new char[n].replace() 方案完全够用,代码行数差不多,可读性不差,维护成本更低。
真正复杂的是混合环境:构建机用 JDK 17,但 Docker 基础镜像还是 openjdk:8-jre。这时候连编译都过不去,得靠 Maven Toolchain 或多阶段构建硬隔离——比一个字符串重复函数难多了。










