Kotlin学习笔记(二)基本类型
如果你学过Ruby,你一定知道“万物皆对象”。Kotlin中也一样。即便数字(Numbers)在Kotlin中是基本类型,也可以这样写:123.toString()
下面我们来看一下Kotlin中的基本类型。
Numbers
Kotlin提供的数字类型和Java很像:
Type | Bitwidth |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
值得注意的是,定义Long形要用大写L:123L
而16进制和二进制则和Java一样:0x0F 0b0101
8进制则不支持。
浮点型和Java一样,类似123.45默认为Double类型,想要Float类型则应写成123.45f
在Java平台中,Number是基本类型。如果需要一个可空的数字(比如Int?)或者泛型,数字就会被装箱(boxed):
1 | val a: Int = 10000 |
==
相当于调用equals
方法。而===
相当于Java中的==
,用来比较引用对象。
注意在官方的Reference中用的是即将被deprecated的identityEquals
,会得到错误的结果,详情参看 http://stackoverflow.com/questions/31666155/kotlins-identityequals-not-working-as-expected
Kotlin中,数字类型不能像Java一样隐式(implicitly)转换类型。
1 | val a:Int? = 1 |
而所有的数字类型都有如下显示方法:
- toByte()
- toShort()
- toInt()
- toLong()
- toFloat()
- toDouble()
- toChar()
写惯Java的人可能觉得这样会很不方便,但事情也没有那么糟糕。因为运算符可以帮我们隐式的转换数字类型:
1 | val l = 1.toLong() + 3 // Long + Int => Long |
仅Int和Long可以进行位运算。运算符与Java不同:
- shl(bits) 有符号的左位移,在Java中是
<<
- shr(bits) 有符号的右位移,在Java中是
>>
- ushr(bits) 无符号的右位移,在Java中是
>>>
- and(bits) 与,在Java中是
&
- or(bits) 或,在Java中是
|
- xor(bits) 异或,在Java中是
^
- inv() 非,在Java中是
~
Characters
Int不能直接转为Char,下面的代码会编译报错:
val a:Char = 1
但是Char可以通过toInt()
方法转为Int。
同数字一样,如果需要一个可空类型(Char?),那么这个Char会被自动装箱(boxed)。
Booleans
没什么好说的,也是自动装箱的问题。
Arrays
Kotlin中的数组写法与Java区别很大,有专门的Array
类来创建和操作数组。
如果我想创建一个[1, 2, 3]数组,可以这样写:
1 | val a:Array<Int> = arrayOf(1, 2, 3) // 注意这里的数字装箱了 |
还可以像这样写:
1 | // Creates an Array<String> with values ["0", "1", "4", "9", "16"] |
如果想要一个空数组,可以使用arrayOfNulls(size: Int)
方法。
如果不想装箱,Kotlin也提供一些原子类型(primitive type)的数组,如IntArray
,ShortArray
等。这些类型没有继承Array
类型,但是拥有相同的方法。每个类型都有对应的工厂方法:
1 | val x: IntArray = intArrayOf(1, 2, 3) |
Strings
s.[0]
相当于Java中的s.charAt(0)
还可以使用iterator:
1 | for (c in str) { |
Kotlin包含两种类型的字符串:与Java字符串相同的escaped strings和新的raw strings。escaped strings中的换行符是\n
,而raw strings就厉害了。看这个例子:
1 | val text = """ |
注意第二行和第三行都是字符串,它们被包含在三个引号中。
Kotlin中再也不用写繁琐的String.format
了,只需要一个$
:
1 | val i = 10 |
甚至可以像这样写表达式:
1 | val s = "abc" |
这篇是用Typora写的,确实很好用,而且是国人出品!