1. 简介

字符串反转是一个常见的编程任务,在 Kotlin 中有多种实现方式。所谓字符串反转,就是将原字符串的字符顺序倒序排列。例如,字符串 "this is a sentence" 反转后应为 "ecnetnes a si siht"

本文将介绍几种在 Kotlin 中反转字符串的方法,并附上示例代码和单元测试,帮助你在实际项目中选择最合适的方式。⚠️ 虽然这个问题看似简单,但在面试或编码练习中经常出现,掌握不同实现方式有助于理解语言特性。

2. 手动循环实现

最直观的方式是通过索引从后往前遍历字符串,逐个拼接字符。我们可以编写一个自定义函数 reverseSentence,使用 for 循环配合 downTo 操作符实现:

fun reverseSentence(sentence: String): String {
    var reversedSentence = ""
    for (i in sentence.length - 1 downTo 0) {
        reversedSentence += sentence[i]
    }
    return reversedSentence
}

优点:逻辑清晰,适合初学者理解
缺点:频繁字符串拼接(+=)在 Kotlin 中效率较低,因为 String 是不可变对象,每次拼接都会创建新对象

测试用例如下:

@Test
fun `reverse sentence using custom method`() {
    val sentence = "this is a sentence"
    val expected = "ecnetnes a si siht"

    assertEquals(expected, reverseSentence(sentence))
}

💡 小贴士:如果真要手动实现,建议使用 StringBuilder 缓存中间结果以提升性能。

3. 使用 String.reversed() 方法

Kotlin 标准库提供了非常简洁的内置方法 —— String.reversed(),一行代码即可完成反转:

@Test
fun `reverse sentence using string reversed() method`() {
    val sentence = "this is a sentence"
    val expected = "ecnetnes a si siht"

    assertEquals(expected, sentence.reversed())
}

优点

  • 语法简洁,可读性强
  • 底层优化良好,性能不错
  • 推荐在日常开发中优先使用

⚠️ 注意:该方法返回的是新的字符串,原字符串不变。

这是目前最推荐的写法,简洁且不易出错,避免了自己实现时可能踩坑的问题。

4. 使用 StringBuilder.reverse()

如果你更熟悉 Java 风格的 API,可以借助 StringBuilderreverse() 方法:

@Test
fun `reverse sentence using stringbuilder reverse() method`() {
    val sentence = "this is a sentence"
    val expected = "ecnetnes a si siht"

    assertEquals(expected, StringBuilder(sentence).reverse().toString())
}

优点

  • 基于可变字符序列操作,效率高
  • 在需要进一步处理字符串时更灵活

缺点

  • 写法略显冗长
  • 需要手动调用 toString() 转换回 String 类型

📌 适用场景:当你已经在使用 StringBuilder 构建字符串,顺便做反转操作时比较合适。

5. 使用递归实现

递归是一种经典的算法思想,也可以用来实现字符串反转。思路如下:

  • 基准条件:如果字符串为空,直接返回空字符串
  • 递归逻辑:将首字符放到剩余字符串反转后的末尾
fun reverseSentenceRecursively(sentence: String): String {
    return if (sentence.isEmpty()) {
        ""
    } else {
        reverseSentenceRecursively(sentence.substring(1)) + sentence[0]
    }
}

对应的测试用例:

@Test
fun `reverse sentence using recursion method`() {
    val sentence = "this is a sentence"
    val expected = "ecnetnes a si siht"
        
    assertEquals(expected, reverseSentenceRecursively(sentence))
}

问题警告

  • 对于长字符串容易导致栈溢出(StackOverflowError)
  • substring(1) 每次都创建新字符串,性能较差
  • 不适用于生产环境

价值所在:主要用于算法练习和面试题,展示对递归的理解。

🧠 思考:能否用尾递归优化?Kotlin 支持 tailrec 关键字,但此场景因拼接发生在递归调用后,无法直接优化。

6. 总结与建议

方法 是否推荐 适用场景
手动循环 + 字符串拼接 学习用途,不推荐生产
String.reversed() ✅✅✅ 日常开发首选
StringBuilder.reverse() 需要链式处理字符串时
递归实现 ⚠️ 算法练习、面试

📌 最终建议

  • **日常开发统一使用 string.reversed()**,简洁高效
  • 避免手动拼接字符串进行反转,性能差
  • 递归仅用于学习和演示,不要用于真实项目

所有示例代码及测试用例均可在 GitHub 上获取:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-strings-4


原始标题:How to Reverse a String in Kotlin