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

Java字符串不可变性疑问及字符串复制练习题解析

关于Java字符串重复n次的解法解析

嘿,我来帮你把这道题的解法补全,同时结合你提到的String不可变知识点来解释清楚~

首先先明确题目要求:给定一个字符串和非负整数n,返回由原字符串重复n次组成的新字符串。比如:

  • stringTimes("Hi", 2) → "HiHi"
  • stringTimes("Hi", 3) → "HiHiHi"
  • stringTimes("Hi", 1) → "Hi"
  • 额外边界情况:stringTimes("Hi", 0) → ""(空字符串)

基础解法(利用String拼接)

你给出的代码框架可以补全为下面这样,虽然String是不可变的,但这种写法在小n的场景下完全可行:

public String stringTimes(String str, int n) {
    String result = "";
    for (int i = 0; i < n; i++) {
        result += str; // 每次拼接都会生成新的String对象
    }
    return result;
}

这里要解释下为什么String不可变还能这么写:String的不可变指的是它内部的字符数组一旦创建就无法修改,所以每次执行result += str时,实际上是把原来的result和str的内容拼接起来,创建一个新的String对象,然后让result变量指向这个新对象,旧的String对象会被JVM的垃圾回收机制处理。

高效解法(用StringBuilder优化)

如果n的数值很大,上面的写法会因为频繁创建新的String对象导致性能下降,这时候就可以用你提到的StringBuilder类来优化,它是可变的字符序列,所有修改操作都是在内部的字符数组上直接进行,不会频繁生成新对象:

public String stringTimes(String str, int n) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < n; i++) {
        sb.append(str); // 直接在可变数组上追加内容
    }
    return sb.toString(); // 最后转为不可变的String返回
}

额外小技巧(Java 11+的API)

如果你使用的是Java 11及以上版本,还可以直接用String类自带的repeat方法一行搞定,底层也是类似StringBuilder的实现,非常简洁:

public String stringTimes(String str, int n) {
    return str.repeat(n);
}

这个方法已经帮我们处理了n=0的边界情况,当n=0时会直接返回空字符串,完全符合题目要求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:03:07