第7章 字符串
由字符组成的一串字符序列,称为“字符串”,在前面的章节中也多次用到了字符串,本章将重点介绍。
7.1 字符串字面量
Kotlin中的字符串字面量有两种:
普通字符串,采用双引号(")包裹起来的字符串。
原始字符串(raw string),采用三个双引号(""")包裹起来的字符串。
7.1.1 普通字符串
普通字符串字面量与Java语言采用双引号(")包裹起来的字符串,大部分计算机语言都是采用这种方式表示字符串。下面示例都是普通字符串字面量:
“Hello World” ①
“\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064” ②
“世界你好” ③
“Hello \nWorld” ④
“A” ⑤
“” ⑥
Kotlin中的字符采用Unicode编码,所以Kotlin字符串可以包含中文等亚洲字符,见代码第③行的"世界你好"字符串。代码第②行的字符串是用Unicode编码表示的字符串,事实上它表示的也是"Hello World"字符串,可通过println函数将Unicode编码表示的字符串输出到控制台,则会看到Hello World字符串。普通字符串字面量为了包含一些特殊的字符,例如换行,则需要转义符,代码第④行"Hello \nWorld"包含了一个换行符,\n是换行转义符,Kotlin转义符参考表6-4所示。
单个字符如果用双引号括起来,那它表示的是字符串,而不是字符了,见代码第⑤行的"A"是表示字符串A,而不是字符A。
7.1.2 原始字符串
原始字符串(raw string)字面量采用三个双引号(""")包裹起来的字符串,原始字符串可以包含任何的字符,而不需要转移,所以也不能包含转义字符。示例如下:
“Hello\nWorld” ①
“”“Hello
World”"" ②
代码第①行和第②行表示相同内容的字符串,代码①行是普通字符串字面量表示在Hello和World中间包含转义换行符,代码第②行是原始字符串字面量可以在Hello和World之间直接换行。
示例代码如下:
//代码文件:chapter7/src/com/a51work6/section1/ch7.1.1.kt
package com.a51work6.section1
fun main(args: Array) {
val s1 =""
val s2 = "Hello World"
val s3 ="\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"
println(s2 == s3) //输出结果为true
val s4 = "Hello\nWorld"
val s5 = """Hello
World"""
println(s4 == s5) //输出结果为true
val s6 ="""Hello\nWorld"""
println(s6)
}
运行结果:
true
true
Hello\nWorld
上述代码中s2和s3是两个内容相同的字符串,这说明无论采用的是Unicode编码还是普通字符都是相同。s4和s5是也两个内容相同的字符串,这说明无论采用的是普通字符串字面量表示,还是采用原始字面量表示都是相同的。
其中==是比较两个字符串。
7.2 不可变符串
在Kotlin中默认的字符串类是String,String是一种不可变字符串,当字符串进行拼接等修改操作时,会创建新的字符串对象,而可变字符串不会创建新对象。在Kotlin中可变字符串类是StringBuilder。
7.2.1 String
本节先介绍不可变字符串String类的使用。Kotlin提供的不可变字符串类是kotlin.String,获得String对象可以有两种方式:
使用字符串字面量赋值。
使用转换函数。
直接使用字符串字面量赋值前面已经使用过了。下面重点介绍转换函数,这些函数都是顶层函数不需要对象就可以直接使用。
1.字节数组转换成字符串函数:
fun String(
bytes:ByteArray, //要转换的字节数组
offset: Int, //字节数组开始索引,该参数可以省略。
length: Int, //转换字节的长度,该参数可以省略。
charset:Charset //解码字符集 ,该参数可以省略。
): String
2.字符数组转换成字符串函数:
fun String(
chars:CharArray, //要转换的字符数组
offset: Int, //字符数组开始索引,该参数可以省略。
length: Int //转换字符的长度,该参数可以省略。
): String
3.可变字符串StringBuilder转换成字符串函数:
fun String(stringBuilder: StringBuilder): String
示例代码如下:
//代码文件:chapter7/src/com/a51work6/ch7.2.kt
package com.a51work6
fun main(args: Array) {
val chars = charArrayOf('a', 'b','c', 'd', 'e') //创建字符数组 ①
val s1 = String(chars) // 通过字符数组获得字符串对象 ②
val s2 = String(chars, 1, 4) // 通过子字符数组获得字符串对象 ③
println("s1 = " + s1) //输出结果s1 = abcde
println("s2 = " + s2) //输出结果s2 = bcde
val bytes = byteArrayOf(97, 98,99) //创建字节数组 ④
val s3 = String(bytes) // 通过字节数组获得字符串对象 ⑤
val s4 = String(bytes, 1, 2) // 通过子字节数组获得字符串对象 ⑥
println("s3 = " + s3) //输出结果s3 = abc
println("s4 = " + s4) //输出结果s4 = bc
}
上述代码第①行是使用charArrayOf函数创建字符数组。代码第②行是将chars数组中的全部字符用来创建字符串。代码第③行是将chars数组中的部分字符用来创建字符串。
代码第④行是使用byteArrayOf函数创建字节符数组。代码第⑤行是采用默认字符集将bytes数组中的全部字节用来创建字符串。代码第⑥行是采用默认字符集将bytes数组中的部分字节用来创建字符串。
字符串在程序代码中应用十分广泛,下面通过几个方面介绍一下在Kotlin中如何使用字符串。本节所介绍的字符串是String类及相关函数使用。
7.2.2 字符串拼接
String字符串虽然是不可变字符串,但也可以进行拼接只是会产生一个新的对象。String字符串拼接可以使用+和+=运算符。+和+=运算符是可以连接任何类型数据拼接成为字符串。
字符串拼接示例如下:
//代码文件:chapter7/src/com/a51work6/section2/ch7.2.2.kt
package com.a51work6.section2
fun main(args: Array) {
val s1 = "Hello"
// 使用+运算符连接
val s2 = s1 + " " ①
val s3 = s2 + "World"