数据类型
在 Kotlin 中,所有变量的成员方法和属性都是一个对象。一些类型是内建的,它们的实现是优化过的,但对用户来说它们就像普通的类一样。
- 基本数据类型:Kotlin 提供了与 Java 类似的基本数据类型,包括:Byte、Short、Int、Long、Float、Double、Boolean 和 Char。
- 字符串类型:Kotlin 中的字符串类型为 String,它是不可变的,可以使用双引号或三引号来定义字符串。
- 数组类型:Kotlin 中的数组类型为 Array,它可以存储相同类型的多个元素,并且大小可以在运行时动态修改。
- 列表类型:Kotlin 中的列表类型为 List 和 MutableList,它们可以存储相同类型的多个元素,但 List 是不可变的,而 MutableList 是可变的。
- 集合类型:Kotlin 中的集合类型包括 Set 和 Map,它们可以存储不同类型的多个元素,但 Set 中的元素是唯一的,而 Map 中包含键值对。
- 元组类型:Kotlin 中没有内置的元组类型,但我们可以使用 Kotlin 的类、数据类或数据类的组件来模拟元组。
- 枚举类型:Kotlin 中的枚举类型为 enum class,它可以表示一组有限的、命名的值。
- 空类型:Kotlin 中的空类型为 null,可以用于表示缺少值或无效状态。
数值
Kotlin 处理数值的方法和 java 很相似,但不是完全一样。比如,不存在隐式转换数值的精度,并且在字面上有一些小小的不同。
Kotlin 提供了如下内建数值类型(和 java 很相似):
类型 | 占位 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
字面值常量
主要是以下几种字面值常量:
- 长整型要加大写 L : 123L
- 默认双精度浮点数(Double) : 123.5 , 123.5e10
- 单精度浮点数(Float)要添加 f 或 F :123.5f
数值常量中可以添加下划线分割
您可以使用下划线增加数值常量的可读性:
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
显式转换
注意:没有隐私转化
// 这是些伪代码,不能编译的
val a: Int? =1 // 一个装箱过的 Int (java.lang.Integer)
val b: Long? = a // 一个隐式装箱的 Long (java.lang.Long)
print( a == b )// 很惊讶吧 这次打印出的是 'false' 这是由于 Long 类型
的 equals() 只有和 Long 比较才会相同
短类型是不会隐式转换为长类型的。这意味着我们必须显式转换才能把Byte 赋值给 Int
val b: Byte = 1 // OK, 字面值常量会被静态检查
val i: Int = b // ERROR
我们可以通过显式转换把数值类型提升
val i: Int = b.toInt() // 显式转换
每个数值类型都支持下面的转换:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
字符串
字符串是由 String 表示的。字符串是不变的。字符串的元素可以通过索引操作读取: s[i] 。字符串可以用 for 循环迭代:
val str :String = "sssdsss";
println(str[3])
for (c in str) {
println(c);
}
trim-margin()函数移除空格:
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
println(text)
字符串模板
val str :String = "d"
println("s$str") //打印sd
println("s${str}s") //打印sds
any和nothingAny
和 Nothing
是 Kotlin 中的两个特殊类型。
-
Any
:Any
是 Kotlin 中的根类型,它是所有非空类型的超类型。类似于 Java 中的Object
类型,可以用来表示任何类型的值。例如,我们可以将一个Int
值赋给一个Any
类型的变量,如下所示:val x: Any = 42
-
Nothing
:Nothing
是 Kotlin 中的特殊类型,它表示不可能存在的值或永远不会返回的函数。例如,当一个函数永远不会返回时,可以将其声明为返回类型为Nothing
。例如:fun fail(message: String): Nothing { throw IllegalStateException(message) }
在上面的示例中,
fail
函数永远不会返回,因为它总是抛出一个异常。另一个常见的用例是当我们在一个 when 表达式中覆盖了所有可能的情况时,可以将其返回类型声明为
Nothing
。这样做可以让编译器知道这个 when 表达式是完备的,不需要添加 else 分支。fun process(x: Any) { when (x) { is String -> println(x.length) is Int -> println(x * 2) else -> throw IllegalArgumentException("Unknown type") } }
在上面的示例中,当
x
不是String
或Int
类型时,我们抛出了一个异常,因此我们可以将process
函数的返回类型声明为Nothing
。这样做可以让编译器知道,当x
的类型不是String
或Int
时,这个函数不会返回任何值。
需要注意的是,虽然 Any
和 Nothing
都是 Kotlin 中的特殊类型,但它们的用途和语义完全不同。Any
是所有非空类型的超类型,而 Nothing
是表示不可能存在的值或永远不会返回的函数的特殊类型。