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()