Kotlin 字串 (String)

字串是由雙引號 " 包起來的文字序列。 Kotlin 對字串處理做了很多優化,讓程式碼變得非常可讀。

字串模板 (String Templates)

這是 Kotlin 最令人喜愛的功能之一! 你可以直接在字串中插入變數,不需要用 + 號慢慢串接。 使用 $ 符號即可。

val name = "Miko"
val age = 18

// Java 寫法 (舊時代)
// println("Name: " + name + ", Age: " + age);

// Kotlin 寫法
println("Name: $name, Age: $age")

如果要插入的是表達式 (例如呼叫函式或計算),請用大括號 ${} 包起來:

val s = "abc"
println("Length is ${s.length}")

多行字串 (Raw Strings)

使用三個引號 """ 可以建立包含換行符號的字串。 這在寫 SQL 指令或 JSON 格式時非常方便。

val query = """
    SELECT * 
    FROM users 
    WHERE age > 18
""".trimIndent()

.trimIndent() 會自動幫你把前面的縮排空白去掉,保持版面整潔。

如果你想要自訂縮排的基準,也可以使用 trimMargin(),預設使用 | 當作邊界:

val msg = """
    |第一行
    |第二行
""".trimMargin()

字串操作

由於字串也是物件,你可以直接使用豐富的 API:

val str = "Hello Kotlin"

println(str[0])         // 取出第一個字元 'H'
println(str.uppercase())// 轉大寫 "HELLO KOTLIN"
println(str[0])         // 取出第一個字元 'H'
println(str.uppercase())// 轉大寫 "HELLO KOTLIN"
println(str.isEmpty())  // 檢查是否為空

// 分割
val list = "1,2,3".split(",") // [1, 2, 3]

// 取代
val newStr = str.replace("Kotlin", "World") // "Hello World"

字串比對

在 Kotlin 中,我們使用 == 來比較字串的 內容 是否相等 (相當於 Java 的 .equals()),這非常直觀。

val s1 = "Hello"
val s2 = "Hello"
val s3 = String("Hello".toCharArray()) // 新物件

println(s1 == s2) // true (內容相同)
println(s1 == s3) // true (內容相同)

// === 是比較參考 (Reference),即是否為同一個物件
println(s1 === s2) // true (因為 String Pool 優化)
println(s1 === s3) // false (s3 是新物件)

常用的字串方法

Kotlin 提供了許多方便的擴充函式:

val s = "  Hello Kotlin  "

// 去除前後空白
println(s.trim()) // "Hello Kotlin"

// 檢查內容
println(s.contains("Kotlin")) // true
println(s.startsWith("  "))   // true
println(s.endsWith("Kotlin")) // false (因為後面有空白)

// 子字串
// substring(startIndex, endIndex) - 包含 start,不包含 end
val sub = "Hello".substring(0, 2) // "He"

走訪字串 (Iterating)

因為字串就是字元 (Char) 的序列,所以你可以直接用 for 迴圈跑:

val str = "Kotlin"
for (char in str) {
    println(char)
}

字串格式化 (String Templates vs Format)

雖然 String Templates ($variable) 很強大,但有時候我們需要更精細的格式控制 (例如小數點後兩位)。這時可以使用 String.format()

val pi = 3.1415926
val formatted = String.format("%.2f", pi) // "3.14" -> 保留兩位小數
println("Pi is $formatted")

StringBuilder (效能優化)

雖然 String 很方便,但它是 不可變 (Immutable) 的。 如果你需要在迴圈中大量串接字串,請務必使用 StringBuilder 以避免效能問題。

// ❌ 不推薦 (會產生大量暫存 String 物件)
var result = ""
for (i in 1..100) {
    result += i
}

// ✅ 推薦
val sb = StringBuilder()
for (i in 1..100) {
    sb.append(i)
}
val finalString = sb.toString()