K otlin 的基本数据类型
Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。
Java和kotlin数据类型对照如下:
|------------|--------------|--------|
| Java基本数据类型 | Kotlin对象数据类型 | 数据类型说明 |
| int | Int | 整型 |
| long | Long | 长整形 |
| short | Short | 短整型 |
| float | Float | 单精度浮点型 |
| double | Double | 双精度浮点型 |
| boolean | Boolean | 布尔型 |
| char | Char | 字符型 |
| byte | Byte | 字节型 |
从表中不难看出,相同的数据类型,Kotlin的首字母都是大写,而Java的首字母都是小写,这一个小小的差别表示Kotlin完全抛弃了Java中的基本数据类型,全部使用了对象数据类型。比如在Java中int是关键字,Kotlin中Int则变成了一个类,有自己的方法和继承结构。可以这样理解,Kotlin 中没有基础数据类型,只有封装的数据类型,每定义的一个变量,其实是Kotlin 封装了一个对象,这样可以保证使用不会出现空指针。数据类型也是一样,所以在比较两个数字的时候,就有比较数据大小和比较两个对象是否相同的区别了。
在 Kotlin 中 , 三个等号 === 表示比较对象地址 , 两个 == 表示判断两个数值是否相等 。
如下述例子:
Kotlin
val a: Int = 10000
println(a === a) // true,值相等,对象地址相等
//这里经过了装箱操作,创建了两个不同的对象
val showNumA: Int? = a
val showNumB: Int? = a
//虽然经过了装箱操作,但是值是相等的,都是100
println(showNumA === showNumB) // false,值相等,对象地址不一样
println(showNumA == showNumB) // true,值相等
运行后对应控制台输出结果为:
这里值得注意一点,如果你要拿这段代码去运行验证,要注意,a变量赋值的大小规则跟 Java 中是一样的,在范围是 [-128, 127] 之间并不会创建新的对象,输出的结果都是 true,从 128 开始,输出的结果才为 false。
类型转换
在kotlin中,较小数据类型并不是较大数据类型的子类型,较小的数据类型不能隐式转换为较大的数据类型。 比如在不进行显式转换的情况下,我们不能把 Int 型值赋给一个 Long 变量。但我们可以使用其toLong()方法。
Kotlin
val b: Int = 1
val i: Long = b.toLong()
如此,便达成了数据类型转换的目的,当然,kotlin中每种数据类型都有这种转化成其他类型的方法:
Kotlin
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
kotlin在某些场景下,也可以使用自动类型转化,但前提是相应逻辑可以根据上下文环境推断出正确数据类型,并且操作符能做相应的重载操作。如:
Kotlin
val longNum = 1 + 1L // Int类型+Long类型=Long类型
位操作
与Java类似,对于Int和Long类型还有一系列位操作符可使用,如下:
Kotlin
shl(bits) -- 左移位 (Java's <<)
shr(bits) -- 右移位 (Java's >>)
ushr(bits) -- 无符号右移位 (Java's >>>)
and(bits) -- 与
or(bits) -- 或
xor(bits) -- 异或
inv() -- 反向
使用场景较少,这里不做赘述。
字符
Kotlin和Java不一样,Char 不能直接和数字操作。Char 必需是单引号 ' 包含起来的。比如普通字符 '0','a'。
字符字面值用单引号括起来表示, 而特殊字符可以用反斜杠转义。转义序列如下:\t、 \b、\n、\r、\'、\"、\\ 和 \$。
字符串
和 Java 一样,String 不可变。同时,Kotlin 支持三个引号 """ 扩起来的字符串,支持多行字符串。例如:
Kotlin
fun main(){
val text = """
1234567
七六五四三二一
示例
"""
println(text)
}
对应控制台输出为:
String对象可以通过 trimMargin() 方法来删除多余的空白,我们可以修改刚刚的代码来进行验证:
Kotlin
fun main(){
val text = """
|1234567
|七六五四三二一
|示例
""".trimMargin()
println(text)
}
对应输出控制台结果为:
如果你细心点,会发现,我在转行的字符串前都加上了|,这是因为trimMargin()中默认 | 用作边界前缀,但你也可以选择其他字符并作为参数传入,比如 trimMargin(">")。(此方法对应源码如下:)
数组
kotlin中,数组用类 Array 来实现,跟Java类似,常用的 size 属性及 get 和 set 方法使用方法一致,包括通过下标来获取或者设置数组对应位置的值。
与之对应,数组有两种创建方式:
- 使用函数arrayOf();
- 使用工厂函数。
Kotlin
val arrayOne = arrayOf(1, 2, 3) //[1,2,3]
val arrayTwo = Array(3, { i -> (i * 2) }) //[0,2,4]
//读取数组
println(arrayOne[0])
println(arrayTwo[1])
对应输出为:
-
除了类Array,还有ByteArray, ShortArray, IntArray,用来表示各个类型的数组,用法同Array。
字符串模板
在kotlin中,字符串可以包含一些小段代码(即模板表达式),来进行求值并把结果合并到字符串中。此处模板表达式以美元符($)开头,由变量名共同构成:
Kotlin
fun main(){
val num = 111
val va = "num = $num"
println(va) // 打印结果为 "num = 111"
}
或者用花括号扩起来表示的任意表达式:
Kotlin
fun main(){
val str = "kotlin"
val strShow = "$str.length is ${str.length}"
println(strShow) // 打印结果为 "kotlin.length is 6"
}
但同时,如果你需要使用$字符的话,你可以使用下列方法:
Kotlin
fun main(){。
val str = """
这个符号 ${'$'} 是美元符号
"""
println(str)
}
对应控制台输出结果为: