1.对于数字的定义,支持java 8的下划线分割的方式
val a = 1_2_3 与 val a = 123 是相同的
2.如果要指定数字类型有两种方式
val a : Float = 1 或者 val a = 1f
3.kotlin没有隐式拓宽转换
val i = 1 val d = 1.1 val f = 1.1f printDouble(d) printDouble(i) // 错误:类型不匹配 printDouble(f) // 错误:类型不匹配
4.kotlin数字定义不支持八进制
十进制: 123 -- Long类型 123L 十六进制: 0x0f 二进制: 0b001
5.当采用可空的引用(Int?)或泛型,后者情况会把数字装箱,装箱的数字保留相等性,但不一定保留同一性
val a: Int = 10000 println(a === a) // 输出“true” val boxedA: Int? = a val anotherBoxedA: Int? = a println(boxedA === anotherBoxedA) // !!!输出“false”!!! 但保留相等性 val a: Int = 10000 println(a == a) // 输出“true” val boxedA: Int? = a val anotherBoxedA: Int? = a println(boxedA == anotherBoxedA) // 输出“true”
6.显示转换,现在无法直接用long类型接收一个int类型的数字,在早起版本会把int类型装箱变为Long类型,后续版本在编译期就会报错,无法通过默认方式的编译成功
// 假想的代码,实际上并不能编译: val a: Int? = 1 // 一个装箱的 Int (java.lang.Integer) val b: Long? = a // 隐式转换产生一个装箱的 Long (java.lang.Long) print(b == a) // 惊!这将输出“false”鉴于 Long 的 equals() 会检测另一个是否也为 Long //以下的方式也是错的 val b: Byte = 1 // OK, 字面值是静态检测的 val i: Int = b // 错误 但是可以通过显式转换 val i: Int = b.toInt() // OK:显式拓宽 可以使用以下的方式 — toByte(): Byte — toShort(): Short — toInt(): Int — toLong(): Long — toFloat(): Float — toDouble(): Double — toChar(): Char 注意: val l = 1L + 3 // Long + Int => Long
7.运算时,整数计算只会得到整数,如果需要返回浮点,需要其中一个进行显式转换
val x = 5 / 2.toDouble() println(x == 2.5)
8.位运算,对于位运算,没有特殊字符来表示,而只可用中缀方式调用具名函数
val x = (1 shl 2) and 0x000FF000 这是完整的位运算列表(只用于 Int 与 Long): — shl(bits) ? 有符号左移 — shr(bits) ? 有符号右移 — ushr(bits) ? 无符号右移 — and(bits) ? 位与 — or(bits) ? 位或 — xor(bits) ? 位异或 — inv()?位非
9.区间比较
区间实例以及区间检测:a..b、x in a..b、x !in a..b
10.字符Char,不能直接作为数字,可以显式转换
字符字面值用单引号括起来: ‘1‘ 。特殊字符可以用反斜杠转义。支持这几个转义序列:\t 、 \b 、\n 、\r 、\‘ 、\" 、\\ 与 \$ 。编码其他字符要用 Unicode 转义序列语法:‘\uFF00‘ fun decimalDigitValue(c: Char): Int { if (c !in ‘0‘..‘9‘) throw IllegalArgumentException("Out of range") return c.toInt() - ‘0‘.toInt() // 显式转换为数字 }
11.数组,在kotlin中使用Array类来表示,在kotlin中是不型变的(invariant)。这意味着 Kotlin 不让我们把 Array<String> 赋值给Array<Any>,以防止可能的运行时失败(但是你可以使用 Array<out Any>,参?类型投影)。
// 创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"] val asc = Array(5) { i -> (i * i).toString() } asc.forEach { println(it) }
12.原生类型数组
val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2] // 大小为 5、值为 [0, 0, 0, 0, 0] 的整型数组 val arr = IntArray(5) // 例如:用常量初始化数组中的值 // 大小为 5、值为 [42, 42, 42, 42, 42] 的整型数组 val arr = IntArray(5) { 42 } // 例如:使用 lambda 表达式初始化数组中的值 // 大小为 5、值为 [0, 1, 2, 3, 4] 的整型数组(值初始化为其索引值) var arr = IntArray(5) { it * 1 }
13.无符号整型(kotlin 1.3起才可用)
val a :UByte = 1u val b: Byte = a.toByte() 注意:将类型从无符号类型更改为对应的有符号类型(反之亦然)是二进制不兼容变更
无符号类型是使用另一个实验性特性(即内联类)实现的。
14.特化的类
与原生类型相同,每个无符号类型都有相应的为该类型特化的表示数组的类型: — kotlin.UByteArray : 无符号字节数组 — kotlin.UShortArray : 无符号短整型数组 — kotlin.UIntArray : 无符号整型数组 — kotlin.ULongArray : 无符号?整型数组 与有符号整型数组一样,它们提供了类似于 Array 类的 API 而没有装箱开销。 此外,区间与数列也支持 UInt 与 ULong(通过这些类 kotlin.ranges.UIntRange 、 kotlin.ranges.UIntProgression 、kotlin.ranges.ULongRange 、 kotlin.ranges.ULongProgression )
原文:https://www.cnblogs.com/developer-wang/p/13158910.html