1 Kotlin基础类型
Kotlin中,我们可以调用任何变量的成员函数和属性,从这个角度来说,一切皆对象。某些类型可以有特殊的内部表现。例如:数字
、字符
和布尔型
在运行时可以表现为基础类型(primitivetypes)
。
1.1 数值
Kotlin的基本数值类型包括Byte
、Short
、Int
、Long
、Float
、Double
、Boolean
等。不同于Java的是,字符不属于数值类型
,是一个独立的数据类型
1.1.1 字面常量
Long类型:用L
做标记,123L
float 类型:用f
或者F
标记:123.5f
1.1.2 数值字面值中的下划线
下划线可以使数值常量更具可读性:
val oneMillion = 1_000_000
1.1.3 表现形式
== 值对比
=== 地址对比
1.1.4 显式转换
小类型不会隐式转换成大类型。不通过显示转换,我们无法把一个Byte
赋值给Int
。
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR
val i: Int = b.toInt() // OK: explicitly widened
val l = 1L + 3 // Long + Int => Long
每个数值类型都支持如下转换:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
1.1.5 运算
如下是位运算操作符的完整列表(只用于Int和Long):
shl(bits) - 有符号左移(Java 的 <<)
shr(bits) - 有符号右移(Java 的 >>)
ushr(bits) - 无符号右移(Java 的 >>>)
and(bits) - 位的与运算
or(bits) - 位的或运算
xor(bits) - 位的异或运算
1.1.6 浮点数比较
相等检查:a == b和a != b
比较操作符:a < b,a > b,a <= b,a >= b
范围初始化和范围检查:a…b,xina…b,x!ina…b
当操作数a和b静态已知为类型Float或Double,以及它们对应的可空类型。但是为了支持通用的使用场景以及提供完整的排序,当操作数不是浮点数的静态类型(如Any、Comparable<…>,类型参数)时,运算操作会使用Float
和Double
的equals
和compareTo
实现,这会导致异与标准,因此:
NaN等于它自己
NaN大与所有其他元素,包括POSITIVE_INFINITY
-0.0小于0.0
1.2 字符
Char
表示字符,不能直接用作数值:
字符用单引号来表示:'1'
。特殊字符可以使用反斜杠
来转义
。
特殊字符可以用反斜杠转义。支持的转义序列有:\t
、\b
、\n
、\r
、\'
、\"
、\\
、\$
。如果要编译其他字符,可以使用 Unicode
转义序列语法:\uFF00
。
我们可以显示地把一个字符转换成一个Int
数值:
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}
就像数值那样,字符的空引用也会自动装箱。装箱操作不会保留字符的身份(identity)。
1.3 字符串
字符串由 String 表示。字符串是不可变的。字符串的元素可通过下标访问:s[i]。字符串可通过 for 循环遍历。
纯字符串通过三个引号("""
)来界定,它不会包含转义而且能够包含换行和任意字符:
val text = """
for (c in "foo")
print(c)
"""
可以通过 trimMargin()
去除开头的空字符:
// 默认情况下,`|` 用作 `margin` 前缀,
// 但是也可以使用其他字符作为参数传给 `trimMargin`,例如 `trimMargin(">")`。
val text = """
|Tell me and I forget
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
字符串可以包含模板表达式:
// 模板表达式以美元符号($)或大括号内的任意表达式
val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"
// 在纯字符串(不支持转义)中展示 $ 符号
val price = """
${'$'}9.99
"""
1.4 布尔型
与Java一致。
Boolean
表示布尔型,有两个值:true 和 false。
布尔的可空引用会自动装箱。
内置操作符包括:
||
- lazy disjunction
&&
- lazy conjunction
!
- negation