数字类型
和Java一样,Kotlin提供了一些内置类型作为它的数字类型。
在Java平台上,数字都是以JVM的的原始类型存储的,除非我们所需要的是一个可空的数字引用或者是泛型,它就会引起数字的装箱操作。什么意思呢?因为Kotlin系统类型分为可空类型和不可空类型,对于Kotlin的数字类型而言,不可空类型就类似与Java中的基本数字类型,是原始的数字类型,例如:int,long,float,double等等,可空类型就相当于引用的数字类型,例如Integer,Long,Float,Double等等。在Java中,从基本数字类型到引用数字类型的转换就是典型的装箱操作,例如int转为Integer。同理,在Kotlin中,非空数字类型到可空数组类型需要进行装箱操作。
al a: Int = 1000
val b: Int = 1000
println(a==b) //true
println(a===b) //true
上面返回的都是true,因为a,b它们都是以原始类型存储的,类似于Java中的基本数字类型。
val a: Int? = 1000
val b: Int? = 1000
println(a==b) //true
println(a===b) //false
首先要说说”==”与”===”,在JavaScript中,===表示“恒等于”,==表示“等于”,=表示“赋值”。这里跟JavaScript有些一样的.
=:赋值,在逻辑运算时也有效;
==:等于运算,比较的是值,而不是引用;
===:完全等于运算,不仅比较值,而且还比较引用,只有两者一致才为真。
上面a和b都进行了装箱操作,所以a和b对应的是不同的引用,但是它们引用的值是相同的。下面这个例子也是同理。
val a: Int = 10000
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'
println(boxedA === anotherBoxedA) // Prints 'false'
小类型不能一隐式的转换为大类型的数据
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR
上面会显示语法错误,需要进行显示的转换。
val b: Byte = 1
val i: Int = b.toInt() // OK: explicitly widened
每个数字类型都有下面的类型转换函数:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
运算的过程中其实会有隐式的类型转换
val l = 1L + 3 // Long + Int => Long
二进制运算
Int和Long的完整二进制运算
shl(bits) – signed shift left (Java’s <<) shr(bits) – signed shift right (Java’s >>) ushr(bits) – unsigned shift right (Java’s >>>) and(bits) – bitwise and or(bits) – bitwise or xor(bits) – bitwise xor inv() – bitwise inversion
Characters类型
Characters代表的就是Char类型,不能直接的当做数字进行运算。
fun check(c: Char) {
if (c == 1) { // ERROR: incompatible types
// ...
}
}
特殊的转义字符使用反斜杠:\t, \b, \n, \r, \’, \”, \ 和 $。
下面是字符到数字的转换
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}
跟数字类型相同,Char类似与java的基本类型char,Char?类似于Java引用类型Character,从非空类型Char到可空类型Char?的转换需要装箱操作。
Booleans类型
跟java一样,Boolean类型有两种值:true 和 false。支持”||”,”&&”,”!”三种运算。
Arrays类型
跟Java的Array类型,它有get、set函数以及其他的有用的成员函数,也有size属性。
class Array<T> private constructor() {
val size: Int
fun get(index: Int): T
fun set(index: Int, value: T): Unit
fun iterator(): Iterator<T>
// ...
}
直接使用arrayOf(1, 2, 3)可创建数组[1, 2, 3]
另外可以直接创建一个Array对象,在Kotlin中,创建对象不需要使用new关键字。
val asc = Array(5, { i -> (i * i).toString() })
确定类型数组
ByteArray, ShortArray, IntArray等等,它们跟Array没有继承关系,属于同一个系列,都有相同的方法和属性集。
val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2]
Strings类型
类似于Java中的String类型,它是不可变对象,字符串的每个元素都是字符,可以使用索引访问:s[i]。可以使用for循环进行遍历。
for (c in str) {
println(c)
}
字符串类型:包含转义字符的转义字符串和包含有多行任意文本的原生字符串。
转义字符串
val s = "Hello, world!\n"
原生字符串
val text = """ for (c in "foo") print(c) """
字符串模板
需要将某个变量的值作为字符串的一部分,在该变量前加上$字符放入字符串即可。
val i = 10
val s = "i = $i" // evaluates to "i = 10"
也可以加上中括号
val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"
上面两种类型的字符串都支持字符串模板的表示
val price = """ ${'$'}9.99 """
Java与Kotlin的类型映射
Java与Kotlin直接是存在互操作性的,也就是说Java中可以调用Kotlin,Kotlin中也可以调用Java,所以在学习Kotlin的时候,我们可以将它们对比来看,特别是类型,它们之间是存在映射关系的,这进一步方便我们了解Kotlin的类型。
Java原始类型对应的Kotlin类型
Java中非原始类型的内置类型与Kotlin的映射
集合类型的映射
数组类型的映射
参考文章:Basic Types
==================================
附上一点Kotlin学习资源:Kotlin学习资源