目錄
一、字串創建
1.1 字串屬性
1.2 字串函式
二、字串截取
三、字串分割
四、字串替換
五、字串比較
六、字串查找
七、字串驗證
八、大雜燴
一、字串創建
String類表示char型別的陣列,字串是不可變的,這意味著長度和元素在創建后不能更改,因為字串物件是不可變的,所以可以共享它們,
fun main() {
val ch = charArrayOf('S', 'h', 'u', 'a', 'i', 'C', 'i')
val str = String(ch)
println(str)//ShuaiCi
}
與Java不同,Kotlin不需要使用new關鍵字來實體化String類的物件, String可以簡單地在雙引號("")中宣告,稱為轉義字串或三引號(""" """),稱為原始字串,
fun main() {
val kotlin = "Kotlin"
val android = """Android"""
println("$kotlin-$android")//Kotlin-Android
}
1.1 字串屬性
| 屬性 | 描述 |
|---|---|
length: Int | 回傳字串序列的長度, |
indices: IntRange | 回傳當前 char 序列中有效字符索引的范圍, |
lastIndex: Int | 回傳 char 序列中最后一個字符的索引, |
1.2 字串函式
| 函式 | 描述 |
|---|---|
compareTo(other: String): Int | 將當前物件與指定物件進行比較以獲得順序, 如果current等于指定的其他物件,則回傳0, |
get(index: Int): Char | 回傳當前字符序列中給定索引處的字符, |
plus(other: Any?): String | 回傳連接字串,其中包含給定其他字串的字串表示形式, |
subSequence(startIndex: Int,endIndex: Int): CharSequence | 從當前字符序列回傳從startIndex開始到endIndex新的字符序列 |
CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false):Boolean | 如果字符序列包含指定的字符序列,則回傳true, |
CharSequence.count(): Int | 回傳char序列的長度, |
String.drop(n: Int): String | 洗掉前n個字符后回傳一個字串, |
String.dropLast(n: Int): String | 洗掉最后一個n字符后回傳一個字串, |
String.dropWhile(predicate: (Char) -> Boolean): String | 回傳一個包含所有字符的字符序列,但滿足給定謂詞的第一個字符除外, |
CharSequence.elementAt(index: Int): Char | 將回傳給定索引處的字符,或如果索引在字符序列中不存在,則拋出IndexOutOfBoundsException, |
CharSequence.indexOf(char: Char, startIndex: Int = 0, ignoreCase: Boolean = false): Int | 回傳從給定的索引值開始給定字符第一次出現的索引, |
CharSequence.indexOfFirst(predicate: (Char) -> Boolean): Int | 回傳與給定謂詞匹配的第一個字符的索引,如果字符序列不包含任何此類字符,則回傳-1, |
CharSequence.getOrElse(index: Int, defaultValue: (Int) ->Char): Char | 如果索引超出當前字符序列的范圍,它將回傳指定索引處的字符或呼叫defaultValue函式的結果, |
CharSequence.getOrNull(index: Int): Char? | 它回傳給定索引處的字符,如果索引超出字符序列的范圍,則回傳null, |
二、字串截取
2.1 substring()函式
substring函式支持IntRange型別(表示一個整數范圍的型別)的引數,until創建的范圍不包括上限值,
/**
* 回傳由給定的 [范圍] 索引指定的子字串,
*/
public fun String.substring(range: IntRange):
//這里需要注意:range.endInclusive + 1
String = substring(range.start, range.endInclusive + 1)
/**
*回傳從 [startIndex] 開始到 [endIndex] 之前結束的此字符序列范圍中的字符子字串,
*
* @param startIndex 起始索引(含),
* @param endIndex 結束索引(獨占), 如果未指定,則使用字符序列的長度,
*/
@kotlin.internal.InlineOnly
public inline fun CharSequence.substring(startIndex: Int, endIndex: Int = length): String = subSequence(startIndex, endIndex).toString()
/**
* 回傳此字符序列的指定 [范圍] 索引處的字符子字串,
*/
public fun CharSequence.substring(range: IntRange): String = subSequence(range.start, range.endInclusive + 1).toString()
看到這里你會發現他們最后呼叫的還是String.subSequence()函式,這里咱們先看看substring,
//字串截取
var intercept = "Write better Android apps faster with Kotlin."
println(intercept.length)//45
println(intercept.substring(10))//er Android apps faster with Kotlin.
println(intercept.substring(10,18))//er Andro
println(intercept.substring(10 until 18))//er Andro
println(intercept.substring(IntRange(10,18)))//er Androi
使用subString(startIndex,endIndex)和subString(rang)時的區別,結合原始碼和實體可以看出,
下標越界
如上面代碼,intercept的字串長度為45,咱們看下面代碼:
println(intercept.substring(30,46))
println(intercept.substring(IntRange(30,46)))

切記下標越界的情況,即StringIndexOutOfBoundsException例外
2.2 subSequence()函式
從當前字符序列回傳從startIndex開始到endIndex新的字符序列
var intercept = "Write better Android apps faster with Kotlin."
println(intercept.length)//45
println(intercept.subSequence(10, 18))//er Andro
三、字串分割
split函式回傳的是List集合資料,Lst集合又支持解構語法特性,它允許你在一個運算式里給多個變數賦值,解構常用來簡化變數的賦值,
3.1 使用字符或字串分割
在實際的專案開發中,不管是Java還是Kotlin這種方式用的要多一些,不過這里值得注意的是,不管是用字符分割,還是字串分割,其都是一個可變引數,即其引數的個數不定,
//字串分割
var cf = "Android|Java|Kotlin"
var data = cf.split("|")
println(data)
這個跟Java類似,只不過回傳的是個List集合資料,

解構語法
var cf = "Android|Java|Kotlin"
//解構語法
var (zero, one, two) = cf.split("|")
println("$zero-$one-$two")
//解構語法過濾元素,通過_符號過濾掉不想要的元素
//如,不想接收第二個元素則可以用 "_"
var (zero2, _, two2) = cf.split("|")
println("$zero2-$two2")

3.2 使用正則運算式分割
在Kotlin中使用正則運算式,使用的是Regex類,而Java中使用正則運算式使用的Pattern類,
var dataRegex = cf.split(Regex("[ao]"))
//[Andr, id|J, v, |K, tlin]
println(dataRegex.toString())
dataRegex = cf.split(Pattern.compile("[ao]"))
//[Andr, id|J, v, |K, tlin]
println(dataRegex.toString())
四、字串替換
Kotlin除了實作Java中的replace()函式外,還提供了另外的replaceFirst()、replaceAfter()、replaceBefore()、replaceIndent()等函式,
4.1 replace()函式
replace()函式提供了4個多載函式,他們能實作不同的功能
4.1.1 replace(oldValue: String, newValue: String, ignoreCase: Boolean = false)
把原字串中的某一個字符全部替換成新的字符,然后回傳新的字串
-
oldChar: 需要替換的字符
-
newChar: 新的字符
-
ignoreCase : 是否參考Java中的replace()函式,默認值為false,即用Java的replace()函式
var th = "Write better Android apps faster with Kotlin."
// 把字符t全部替換為!
println(th)
println(th.replace("t", "!"))

4.1.2 replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence)
根據定義的正則規則去匹配源字串,把滿足規則的字串通過transform{}高階函式映射的新字串替換,
-
regex: 正則運算式,用來決定要替換哪些字符
-
transform: 高階函式(匿名函式,用來確定該如何替換正則運算式搜索到的字符)
var reg= th.replace(Regex("[rte]")){
when(it.value){
"r" ->"7"
"t" ->"!"
"e" ->"5"
else -> it.value
}
}
println(reg)

其他兩個函式就不占用篇幅了,用法是一樣的,
4.2 replaceFirst()函式
把滿足條件的第一個字符或字串替換成新的字符或字串,
//把第一個字符A替換為V
println(th.replaceFirst("e", "V"))
//把第一個字串er替換為Victory
println(th.replaceFirst("er", "Victory"))

4.3 replaceAfter()函式
截取滿足條件的第一個字符或字串前面的字串,包含滿足條件字符或字串自身,并在其后面加上新的字串,
//截取字符p,并在其后面加上Kotlin
println(th.replaceAfter("p", "Kotlin"))
//截取字串Android,并在其后面加上帥次
println(th.replaceAfter("Android", "帥次"))

4.4 replaceBefore()函式
截取滿足條件的第一個字符或字串后面的字串,包含滿足條件字符或字串自身,并在其前面加上新的字串,
//截取字符p,并在其前面加上Kotlin
println(th.replaceBefore("p", "Kotlin"))
//截取字串Android,并在其前面加上帥次
println(th.replaceBefore("Android", "帥次"))

4.5 replaceIndent()函式
檢測常見的最小縮進,并將其替換為指定的 newIndent,
var indent = " aaa aaaA"
println(indent)
//檢測常見的最小縮進,并將其替換為指定的 newIndent,
println(indent.replaceIndent())
//檢測所有輸入行的通用最小縮進,將其從每一行中洗掉,如果第一行和最后一行是空白的,也將其洗掉(注意空白與空的區別)
println(indent.trimIndent())

五、字串比較
在Kotlin中,用 == 檢查兩個字串中的字符是否匹配,用 === 檢查兩個變數是否指向記憶體堆上同一物件,而在Java中 == 做參考比較,做內容比較時用equals方法,
== 和 ===
//字串比較
val str1 = "Kotlin"
val str2 = "Kotlin"
val str3 = "kotlin".replace("k","K")
println("$str1-$str2-$str3")
//比較的是內容,true
println(str1 == str2)//true
println(str1 == str3)//true
//這里為什么是true,字串內容不可變,Java和Kotlin有個字串常量池
println(str1 === str2)//true
println(str1 === str3)//false
常量池:是為了方便快捷地創建某些物件而出現的,當需要一個物件時,就可以從池中取一個出來(如果池中沒有則創建一個),則在需要重復創建相等變數時節省了很多時間,常量池其實也就是一個記憶體空間,常量池存在于方法區中,
String類也是Java中用得多的類,同樣為了創建String物件的方便,也實作了常量池的技術,
equals
val str1 = "Kotlin"
val str2 = "Kotlin"
val str4 = "kotlin"
println(str1.equals(str2))//true
println(str1.equals(str4))//false
//第二個引數加true代表忽略大小寫比較,
//第二個引數加false代表不忽略大小寫比較,
println(str1.equals(str4,true))//true
六、字串查找
6.1 獲取第一個元素
6.1.1 first()函式和first{}函式
var seek = "Write better Android apps faster with Kotlin."
println(seek.first())
//查找等于某一個字符的第一個元素
var data = seek.first {
it == 'A'
}
println(data)
在這里介紹一下firstOrNull()函式和firstOrNull{}函式:
-
如果字串為空串時,first()函式會拋出例外,而firstOrNull()函式會回傳null,
-
如果字串為空串時,first{}函式會拋出例外,而firstOrNull{}函式會回傳null
6.1.2 firstOrNull()函式和firstOrNull{}函式
seek = ""
//報錯:NoSuchElementException: Char sequence is empty.
// println(seek.first())
println(seek.firstOrNull())//null
//如果字串為空串或字串內沒有該字符,則回傳null
var foN= seek.firstOrNull {
it == 'N'
}
println(foN)//null
seek = "Note"
//滿足條件回傳:char=N
foN= seek.firstOrNull {
it == 'N'
}
println(foN)//N
6.2 獲取最后一個元素
seek = "Note"
println(seek.last())//e
var la = seek.last {
it == 't'
}
println(la)//t
lastOrNull()firstOrNull()類似,lastOrNull{}firstOrNull{}類似,
6.3 查找元素
-
indexOf() : 查找某一個元素或字串在原字串中第一次出現的下標,
-
indexOfFirst{}: 同indexOf(),
-
lastIndexOf(): 查找某一個元素或字串在原字串中最后一次出現的下標,
-
indexOfLast{}: 同lastIndexOf(),
val cz = "Android|Java|Kotlin"
//查找i在cz中第一次出現的下標,
println(cz.indexOf('i'))//5
println(cz.indexOf("i"))//5
//從第10位開始,查找i在cz中第一次出現的下標,
println(cz.indexOf("i", 10))//17
var z = cz.indexOfFirst {
it == 'i'
}
println(z)//5
//查找i在cz中最后一次出現的下標,
println(cz.lastIndexOf('i'))//17
println(cz.lastIndexOf("i"))//17
//從第10位開始,查找i在cz中第一次出現的下標,
println(cz.lastIndexOf("i", 10))//5
z = cz.indexOfLast {
it == 'i'
}
println(z)//17
七、字串驗證
在實際的開發中,特別是Android開發中,會經常遇到驗證輸入框的內容是否為空串的時候,
下列幾個函式都是處理字串為空串或為空的:
-
isEmpty(): 其原始碼是判斷其length是等于0,若等于0則回傳true,反之回傳false,不能直接用于可空的字串
-
isNotEmpty(): 其原始碼是判斷其length是否大于0,若大于0則回傳true,反之回傳false,不能直接用于可空的字串
-
isNullOrEmpty(): 其原始碼是判斷該字串是否為null或者其length是否等于0,
-
isBlank(): 其原始碼是判斷其length是否等于0,或者判斷其包含的空格數是否等于當前的length,不能直接用于可空的字串
-
isNotBlank(): 其原始碼是對isBlank()函式取反,不能直接用于可空的字串
-
isNotOrBlank(): 其原始碼判斷該字串是否為null,或者呼叫isBlank()函式
var verification = ""
println(verification)
println(verification.isEmpty())//true
println(verification.isNotEmpty())//false
println(verification.isNullOrEmpty())//true
println(verification.isBlank())//true
println(verification.isNotBlank())//false
println(verification.isNullOrBlank())//true
verification = "Kotlin"
println(verification)
println(verification.isEmpty())//false
println(verification.isNotEmpty())//true
println(verification.isNullOrEmpty())//false
println(verification.isBlank())//false
println(verification.isNotBlank())//true
println(verification.isNullOrBlank())//false
八、大雜燴
8.1 字串拼接
-
使用+
-
使用plus()函式
var name = "ShuaiCi "
//字串拼接
println(name + "回籠早覺藝術家")//ShuaiCi 回籠早覺藝術家
println(name.plus("無所謂最佳男主角"))//ShuaiCi 無所謂最佳男主角
println(name.plus(12.5))//ShuaiCi 12.5
8.2 字串長度獲取
-
直接用length屬性獲取長度
-
用count()函式獲取,其實count()函式的做法也是回傳了length長度,
var name = "ShuaiCi "
//字串長度
println(name.length)//8
println(name.count())//8
8.3 統計重復字符
-
count()函式,是回傳了length屬性獲取字串的長度,
-
count{}高階函式,用于統計字串中重復某個字符的個數,
var name = "ShuaiCi "
//在name中有2個i
var coun = name.count {
it == 'i'
}
println(coun)//2
8.4 字串反轉
使用reversed()函式可以將字串的元素反轉,
println(name)//ShuaiCi
println(name.reversed())// iCiauhS
8.5 判斷字串的起始與結尾
8.5.1 起始:startsWith()
判斷其字串是否由某一個字符或字串起始,
var name = "ShuaiCi "
println(name.startsWith('S'))//true
println(name.startsWith("Shuai"))//true
println(name.startsWith("Ci"))//false
println(name.get(5))//C
//當起始位置為5時,是否由字串`Ci`起始
println(name.startsWith("Ci", 5))//true
8.5.2 結尾:endsWith()
判斷其字串是否由某一個字符或字串結尾,
var name = "ShuaiCi "
println(name.endsWith(' '))//true
println(name.endsWith("Shuai"))//false
println(name.endsWith("Ci "))//true
8.6 去空格
使用trim()函式回傳一個字串,其值為該字串,洗掉了任何前導和尾隨空格,
name = " ShuaiCi "
println(name)// ShuaiCi
println(name.trim())//ShuaiCi
var cun = name.trim {
it == ' '
}
println(cun)//ShuaiCi
8.7 字串模板
-
模板支持在字串的引號內放入變數值,
-
字串內嵌運算式,
name = "Shuaici"
val age = 18
val money = 1.25f
//引號內放入變數值
//Shuaici 今年 18 ,身上帶了 1.25 巨款
println("$name 今年 $age ,身上帶了 $money 巨款")
val isMan = true
//添加運算式
//Shuaici 是個 純爺們
println("$name 是個 ${if (isMan) "純爺們" else "萌妹子"}")
8.8 字串遍歷
name = "Shuaici"
name.forEach {
print("$it|")
}

8.9 字串型別轉換
var str = "12.5"
//使用toFloatOrNull,當str為null或空串時回傳null
//使用toFloat,str為null或空串時報錯:NumberFormatException
println(str.toFloatOrNull())//12.5
str= ""
println(str.toFloatOrNull())//null
// println(str.toFloat())//NumberFormatException
var i = true
println(i.toString())//true
其他參考型別轉換類似,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/382918.html
標籤:其他
