Kotlin学习(二)基本类型

数据类型

Kotlin的数据类型同java基本相同,但是在Kotlin中,所有的类型都是对象,即我们可以调用任何一个变量的成员方法和属性,这点同java稍微有点差别。Kotlin中的数据类型和其所占用的空间位数如下:

类型 位数 使用示例
Double 64 1.23(带小数默认为Double)
Float 32 1.23F或者1.23f
Long 64 100L
Int 32 123
Short 16 123
Byte 8 123

另外字符在Kotlin中并不是数字,下面会单独讲到。
十六进制使用0x作为前缀,二进制使用0b作为前缀,不支持八进制。

数据相等的判断

对于数据相等的判断在kotlin中有===和==,它们的区别是什么呢?==判断是两个数据的值是否相等;但是===则判定的两个数据是否是同一个对象。也就是说===的判断条件更加苛刻一些。如:

1
2
val a: Int = 10000
print(a === a) // Prints 'true'

两个a指向的是通一个对象,所以用===判断肯定是相等的。
但是如果我们创建两个可为null的引用时,都会经过装箱操作,经过装箱后再用===判断就不相等了;但是用==判断还是会相等的,因为它们的值是一样的,仅仅是指向了两个不同的对象。

1
2
3
4
5
6
7
8
9
10
val a: Int = 10000
print(a == a) // Prints 'true'

//经过了装箱,创建了两个不同的对象
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

//虽然经过了装箱,但是值是相等的,都是10000
print(boxedA == anotherBoxedA) // Prints 'true'

类型转化

我们知道在java中数据类型根据级别可以自动转化,如一个byte的数据可以直接赋值给一个int类型的数据,但是反过来需要进行强制类型转化,而且可能丢失部分数据。

1
2
3
4
5
//可以直接赋值
byte a = 10;
int b = a;
//需要强制类型转化
byte c= (byte) b;

但是在kotlin中就不能这样了,如果直接把Byte类型数据赋值给Int就会报错,但是我们可以代用其toInt()方法。

1
2
3
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR
val i: Int = b.toInt() //OK

每种数据类型都有下面的这些方法,可以转化为其它的类型:

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

有些情况下也是可以使用自动类型转化的,前提是可以根据上下文环境推断出正确的数据类型而且数学操作符会做相应的重载。例如下面是正确的:

1
val l = 1L + 3 // Long + Int => Long

位操作符

对于Int和Long类型,还有一系列的位操作符可以使用,分别是:

  • shl(bits) – 左移位 (Java’s <<)
  • shr(bits) – 右移位 (Java’s >>)
  • ushr(bits) – 无符号右移位 (Java’s >>>)
  • and(bits) – 与
  • or(bits) – 或
  • xor(bits) – 异或
  • inv() – 反向

字符

字符是Char类型,是用单引号括起来当个字符, 如’1’。字符不能直接转化为Int类型,但是可以使用toInt()方法进行转化。

1
2
3
4
5
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}

数组

数组用类Array实现,并且还有一个size属性及get和set方法,由于使用[]重载了get和set方法,所以我们可以通过下标很方便的获取或者设置数组对应位置的值。数组的创建两种方式:一种是使用函数arrayOf();另外一种是使用工厂函数。如下所示,我们分别是两种方式创建了两个数组:

1
2
3
4
5
6
//[1,2,3]
val a = arrayOf(1, 2, 3)
//[0,2,4]
val b = Array(3, { i -> (i * 2) })
//读取数组内容
val b = a[0]

除了类Array,还有ByteArray, ShortArray, IntArray,用来表示各个类型的数组,省去了装箱操作,因此效率更高,其用法同Array一样:

1
2
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

字符串

字符串使用String表示,可以是由双引号括起来,如果字符串设计到了换行或者特殊字符等也可以用”””括起来,如:

1
2
3
4
5
val a = "Welcome"
val b = """
val a = arrayOf(1, 2, 3)
val b = Array(3, { i -> (i * 2) })
"""

对于字符串我们可以使用for循环进行遍历,并且使用[]读取每个字符:

1
2
3
for (c in str) {
println(c)
}