Kotlin 提供了一组表示数字的内置类型。对于整数,有四种不同大小的类型,因此值的范围也不同。
类型 | 位数 | 最小值 | 最大值 |
---|---|---|---|
Byte | 8 | -128(-2^7) | 127(2^7-1) |
Short | 16 | -32768(-2^15) | 32767(2^15-1) |
Int | 32 | -2,147,483,648 (-2^31) | 2,147,483,647 (2^31 - 1) |
Long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 - 1) |
如果初始值未超出 Int 最大值的整形值都会推断为 Int 类型,如果超出了,则会推断为Long类型。
val one = 1 //推断为Int
val threeBillion = 3000000000 //推断为Long
如果需要显式指定Long类型,需要在该值后面加 L 后缀或者声明类型
val long = 1L
val long:Long = 1
对于浮点数,Kotlin提供了Float与Double类型
Col1 | Col2 | Col3 | Col4 | Col5 |
---|---|---|---|---|
Float | 32 | 24 | 8 | 6-7 |
Double | 64 | 53 | 11 | 15-16 |
val pi = 3.14 //Double
val e = 2.7182818284 //Double
val eFloat = 2.7182818248f //Float 实际值为 2.7182817
val eFloatType:Float = 2.7182818248
数值常量字面值有以下几种:
注意:不支持八进制
tips:
数字字面值中可以用下划线作为分隔符使数字更易读
val oneMillion = 1_000_000
val longNumber = 1234_5678_1234L
val hexBytes = 0XFF_EC_DE_5E
val bytes = 11000000_11110000_11110000_22220000
对于位运算,没有特殊字符来表示,只可用中缀方式调用具名函数,例如
val x = (1 shl 2) and 0x000FF000
这是完整的位运算列表(只用于Int与Long)
数字比较
– 相等性检测:a == b 与 a != b
– 比较操作符:a < b, c > d,a <= b,c >= d
– 区间实例以及区间检测:a…b,x in a…b,x !in a…b
Kotlin 为无符号整数引入了以下类型:
kotlin.UByte: 无符号 8 比特整数,范围是 0 到 255
kotlin.UShort: 无符号 16 比特整数,范围是 0 到 65535
kotlin.UInt: 无符号 32 比特整数,范围是 0 到 2^32 - 1
kotlin.ULong: 无符号 64 比特整数,范围是 0 到 2^64 - 1
无符号类型支持其对应有符号类型的大多数操作。
布尔用Boolean类型表示,它有两个值:true与flase
若需要可控引用布尔会被装箱
内置的布尔运算有:
字符用Char类表示,他们不能直接当做数字
fun check(c:Char){
if(c == 1){ //错误:类型不兼容
// ....
}
}
当需要可用引用时,像数字、字符会被装箱,装箱操作不会保留同一性
- 字符串用String类型表示。
- 字符串是不可变的,字符
- 字符串的元素,可以使用索引运算符访问字符:s[i]
for (c in str){
println(c)
}
2.可以用+操作符连接字符串
val s = "abc" + 1
println(s + "def")
3.如果有大量文本需要保留原来格式,可用"""括起来
val text="""
for (c in "foo")
print(c)
"""
字符串字面值可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:
val s = "abc"
println("$s.length is ${s.length}") // 输出“abc.length is 3”
数组在 Kotlin 中使用 Array 类来表示,它定义了 get 与 set 函数(按照运算符重载约定这会转变为 [])以及 size 属性,以及一些其他有用的成员函数:
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ……
}
// 创建一个 Array 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }
使用 is 操作符或其否定形式 !is 在运行时检测对象是否符合给定类型:
if (obj is String) {
print(obj.length)
}
if (obj !is String) { // 与 !(obj is String) 相同
print("Not a String")
} else {
print(obj.length)
}
大多数场景都不需要在 Kotlin 中使用显式转换操作符,因为编译器跟踪不可变值的 is-检测以及显式转换,并在必要时自动插入(安全的)转换:
fun demo(x: Any) {
if (x is String) {
print(x.length) // x 自动转换为字符串
}
}
//编译器足够聪明,能够知道如果反向检测导致返回那么该转换是安全的:
if (x !is String) return
print(x.length) // x 自动转换为字符串
智能转换用于 when 表达式 和 while 循环 也一样:
when (x) {
is Int -> print(x + 1)
is String -> print(x.length + 1)
is IntArray -> print(x.sum())
}
通常,如果转换是不可能的,转换操作符会抛出一个异常。因此,称为不安全的。 Kotlin 中的不安全转换使用中缀操作符 as。
val x: String = y as String
为了避免异常,可以使用安全转换操作符 as?,它可以在失败时返回 null:
val x: String? = y as? String
请注意,尽管事实上 as? 的右边是一个非空类型的 String,但是其转换的结果是可空的。