Kotlin中如何高效生成重复n次指定字符的字符串?
嘿,这个问题提得非常到位!你当前用循环拼接字符串的方式确实存在性能瓶颈——因为Kotlin里的String是不可变对象,每次执行s += "*"都会创建一个全新的字符串实例,频繁的对象创建和内存拷贝直接导致了O(n²)的时间复杂度,当n很大的时候性能下降会很明显。
下面给你几种无需手动循环、时间复杂度为O(n)的优雅实现方式:
1. 最简洁的方式:使用标准库的repeat()方法
Kotlin的String类已经内置了repeat()扩展函数,专门用来生成重复指定次数的字符串,底层实现已经做了性能优化,完全不需要自己写循环:
val n = 100 val s = "*".repeat(n)
这一行代码就搞定了,可读性拉满,性能也最优——底层会直接分配足够大小的字符数组,一次性填充后生成最终字符串,全程只有一次内存分配和拷贝。
2. 手动构建字符数组(适合自定义场景)
如果需要更灵活的字符生成逻辑(比如不是固定的*,而是根据索引生成不同字符),可以先创建CharArray再转成String:
val n = 100 val s = String(CharArray(n) { '*' })
这里通过CharArray的初始化lambda,直接把每个位置的字符设为*,然后通过String的构造函数一次性生成结果,同样是O(n)的时间复杂度,没有额外的对象开销。
3. 用buildString构建(复杂场景首选)
如果后续需要扩展字符串的构建逻辑(比如在重复的*前后加其他内容),可以用Kotlin标准库的buildString函数,它内部使用StringBuilder来高效构建字符串,避免了频繁的字符串拼接:
val n = 100 val s = buildString { repeat(n) { append('*') } }
buildString会自动管理StringBuilder的生命周期,你只需要专注于内容的添加,性能同样是O(n)级别。
为什么这些方法更高效?
这些方案的核心都是一次性分配足够的内存空间,然后直接填充内容,避免了循环拼接时多次创建新字符串的开销,从根本上把时间复杂度从O(n²)降到了O(n)。
内容的提问来源于stack exchange,提问作者Rainmaker

