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
相关产品推荐
相关产品推荐

