字符串
查找
fun main() {
var str="Hello World"
println(str.first()) //获取第1个元素:H
println(str.last()) //获取最后1个元素:d
println(str.get(4)) //获取第5个元素:o
println(str[4]) //获取第5个元素:o
println(str.indexOf('o')) //查找字符串在原字符串中第1次出现的角标:4
println(str.lastIndexOf('o')) //查找字符串在原字符串中最后1次出现的角标:7
}
截取
subString()与subSequence()的区别在于,后者的返回值是CharSequence
fun main() {
var str = "Hello World!"
println(str.substring(3)) //截取角标为3,到角标结束的字符
println(str.substring(3, 7)) //截取角标为3,到角标为6的字符
println(str.substring(IntRange(3, 7))) //截取角标为3,到角标为7的字符
println(str.subSequence(3, 7)) //截取角标为3,到角标为6的字符
println(str.substring(IntRange(3, 7))) //截取角标为3,到角标为7的字符
}
替换
fun main() {
var str = "Hello World! Hello World!"
println(str.replace("World", "Kotlin"))
println(str.replaceFirst("World", "Kotlin"))
println(str.replaceBefore("!", "Kotlin"))
println(str.replaceAfter("Hello ", "Kotlin!"))
}
分隔
Kotlin的split()函数可传入多个分隔符。
fun main() {
var str = "hello.kotlin/world"
var split = str.split(".", "/")
println(split)
}
去空格
trim()用于删除字符串前面的空格、trimEnd()用于删除后面的字符。
fun main() {
var str = " Hello World! "
println(str.trim())
println(str.trimEnd())
}
字符串字面值
转义字符串
采用传统的反斜杠“ \ ”方式对字符进行转义,常见的转义字符有:
\r:回车符,将光标定位到当前行的开头,不会跳到下一行
\n:换行符,跳到下一行开头
\t:制表符,将光标定位到下一个制表符的位置,类似文档中的Tab
\b:退格符号,类似键盘上的BackSpace
\':单引号字符,Kotlin中,单引号表示字符的开始与结束,直接写会报错
\":双引号字符,Kotlin中,双引号表示字符串的开始与结束,直接写会报错
\\:反斜杠字符,单独一个斜杠是转义字符
原生字符串
使用三对引号(""" """)把所有字符括起来,可以保证原有字符的输出,即使有转义符号也不会被转义。
fun main() {
//转义字符串
val str1 = "您\n好"
println(str1)
//原生字符串
val str2 = """您 \n 好"""
println(str2)
}
类型转换
类型检查
可使用is操作符或!is反向操作符提前检测,返回值为Boolean。
var a:Any = "hello"
var result1 = a is String
var result2 = a !is String
定义变量a时使用的是Any类型,相当于java的Object类型,表示任意类型。
智能类型转换
fun main() {
var a: Any = "hello"
if (a is String) {
println(a.length)//a自动转换为String类型,可以使用length
}
}
Any类型的好处在于,通过is操作符进行判断时,当判断成功,会自动将其转换为相应的类型。
强制类型转换
as操作符
fun main() {
var a1 = "1"
var b1: String = a1 as String
println(b1.length)
var a2 = 1
var b2: String = a2 as String
println(b2.length)
}
后半段代码在编译器中不会报错,但在运行时会。可见在Kotlin中,Integer类型的变量不能用as操作符转换成String。
as?操作符
由上可知,使用as操作符转换时,运行时可能会抛出异常。为了避免,此时应使用安全转换操作符。若转换失败,则是返回null,不会抛出异常。
fun main() {
var a = 1
var b: String? = a as? String
println(b?.length)//运行结果:null
}
在声明b变量时,使用的是" String? ",意为声明了一个可以为空的变量b。
空值处理
开发过程中,经常会遇到空指针异常的问题,如果处理不当,极大概率会出现报错,进而引起程序崩溃。在Kotlin中,为了处理空指针问题,引入了Null机制。
可空类型变量(?)
Kotlin中可将变量分为两种变量:可空类型的与非空类型的变量。一般情况下,变量默认非空。
想要定义某个变量为可空变量时,声明时在数据类型后添加 “?” 来标识。
var name: String //非空
var age: Int? //可空
如上,给变量name赋值null会引起报错,因为当变量为非空变量时,不能被赋值为null,反之变量age则无此问题。
但在使用可空变量时,需要给其赋初始值,至少得是个null,否则同样会报错。
var name: String = "Tom" //改进后的非空
var age: Int? = null //改进后的可空
安全调用符(?.)
此符号专门用于判断变量是否为空,是语句: if( 变量 != null ) 的替代品。
//引入安全调用符之前
fun main(){
var name: String = "Tom"
var age: Int? = null
if(telephone != null){
print(telephone.length)
} else {
telephone = "18800008888"
print("telephone =" + telephone)
}
}
//引入安全调用符之后
fun main(){
var name: String = "Tom"
var age: Int? = null
var result = telephone?.length
print(result)
}
运行引入安全调用符后的代码,结果为null,可见当前变量为空时,编译也不会报错,而是返回一个null值。
Elvis操作符(?: )
使用可变变量时,当当前变量为空,会返回一个null值,若我们不想要为空时返回null值,而是返回一个默认值,可使用Elvis操作符。
fun main(){
var name: String = "Tom"
var age: Int? = null
var result = telephone?.length ?: "18800008888"
print(result)
}
此时运行结果为18800008888,这是Elvis操作符给可空变量赋予的默认值,有了这个之后,可空变量不再是简单的null。