Kotlin学习_基本类型(Basic Types)

Versatile

本文是学习Kotlin的基本类型,Kotlin的基本类型与Java有一些不同,例如整数类型,Java是int表示,而Kotlin是Int表示;例如布尔类型,Java是boolean表示,而Kotlin是用Boolean表示。

在 Kotlin 中,所有变量的成员方法和属性都是一个对象,我们可以在任何变量上调用成员函数和属性。
在本文中,将会讲解经常被使用的类型:NumbersCharactersBooleansArraysStrings

Numbers(数值)

Kotlin处理数值的方式与Java类似,单又不完全相同,例如,数值没有隐式扩展转换,在默写情况下文字也略有不同。
Kotlin 提供了如下内建数值类型(与Java类似)

Type Bit width(字宽)
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

注意:字符不是kotlin中的数值类型

字面常量(Literal Constants)

对于整数值,有以下几种常量

  • 整型: 123
    • 长整型要加 L: 123L
  • 16进制: 0x0F
  • 二进制: 0b00001011

对于浮点数值

  • Doubles类型: 123.5, 123.5e10
  • Floats类型要加 f or F: 123.5f

注意:不支持8进制

数值中的下划线(1.1版开始)

Java8支持数值使用下划线类分割数字分组,可以使用下划线使数字常量更易读:

1
2
3
val oneMillion = 1_000_000
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

等同于

1
2
3
1000000
ffecde5e
11010010011010011001010010010010

表示法(Representation)

在Java平台上,数值被 JVM 虚拟机以字节码的方式物理存储的,除非我们需要做可空标识(比如说 Int?) 或者涉及泛型。

1
2
3
4
5
val a: Int = 10000
print(a === a) // 打印'true' ,与Java的‘===’一样
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // 打印`false`

另一方面,值是相等的

1
2
3
4
5
val a: Int = 10000
print(a == a) // 打印 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // 打印 'true'

显式转换(Explicit Conversions)

由于不同的表示,短类型不是长类型的子类型

1
2
3
4
//这是些伪代码,不能编译的
val a: Int? =1 // Int (java.lang.Integer)
val b: Long? = a // Long (java.lang.Long)
print( a == b ) // 打印 'false' ,由于 Long 类型的 equals() 只有和 Long 比较才会相同

短类型是不会隐式(自动)转换为长类型的,需要显示(手动)转换才行

1
2
val b: Byte = 1 // 
val i: Int = b // 错误,不能自动转换

改为显示(手动)转换

1
val i: Int = b.toInt() // 成功

数值类型支持的转换有下面几种

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

Kotlin会自动转换类型的,比如

1
val l = 1.toLong + 1 // Long  + Int => Long,自动转换成Long类型

运算符(Operations)

Kotlin支持标准的算术运算表达式,这些运算符被声明为相应类的成员。
对于位操作,没有特殊的字符,只是命名的函数可以以中缀形式调用,例如

1
val x = (1 shl 2) and 0x000FF000

支持的位运算操作符有(仅适用于IntLong类型)

  • shl(bits) – 带符号左移 (相当于 Java的 <<)
  • shr(bits) – 带符号右移 (相当于 Java的 >>)
  • ushr(bits) – 无符号右移 (相当于 Java的 >>>)
  • and(bits) – 按位与
  • or(bits) – 按位或
  • xor(bits) – 按位异或
  • inv() – 按位翻转

Characters(字符)

字符类型用 Char 表示,不能直接当做数值来使用

1
2
3
4
5
fun check(c: Char) {
if (c == 1) { // 错误:类型不匹配
// ...
}
}

字符文字用单引号括起来:’1’,可以使用反斜杠转义特殊字符,支持以下转义序列:\t,\b,\n,\r,\’,\“,\和\$ ‘,
要编码任何其他字符,使用Unicode转义序列语法:’\uFF00’。

下面是将字符类型显示(手动)转换成Int类型

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() // 显示转换为数值类型
}

Boleans(布尔值)

Kotlin的Boolean同Java的boolean类型一样,只有truefalse

Boolean的操作同Java一样

  • || – 或者
  • && – 并且
  • ! - 非

Arrays(数组)

Kotlin中的数组由Array表示,通过[]调用getset方法,支持size属性,以及其他,下面是Array代码

1
2
3
4
5
6
7
8
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() 创建Array,arrayOf(1, 2, 3) 创建了一个[1, 2, 3] 的数组。
可以使用 arrayOfNulls() 创建一个指定大小的空Array。

另外也可以使用工厂函数,该函数采用数组大小​​和函数,该函数可以返回每个数组元素的索引的初始值

1
2
// 创建 Array<String> 内容为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })

注意:和 java 不一样,arrays 在 kotlin 中是不可变的。这意味这 kotlin 不允许我们把 Array转为 Array,这样就阻止了可能的运行时错误(但可以用 Array)

Kotlin 有专门的类来表示原始类型: ByteArray, ShortArray, IntArray 等等。这些类与Array类没有继承关系,但它们具有相同的方法和属性集。也有相应的工厂功能

1
2
val x: IntArray = intArrayOf(1, 2, 3) // 创建一个Int类型的Array
x[0] = x[1] + x[2]

Strings(字符串)

字符串由类型String表示,字符串是不可变的。字符串的元素是可以通过索引操作访问的字符:s [i]。一个字符串可以用一个for循环迭代

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

字符串字面量(String Literals)

Kotlin 有两种类型的 String :一种是可以带分割符的,一种是可以包含新行以及任意文本的。
带分割符的 String 与Java 的 String类似

1
val s = "Hello World!\n"

如果String 是由三个引号包裹的(“””),不可以包含分割符但可以包含其它字符:

1
2
3
4
val text = """
for (c in "foo")
print(c)
"""

可以使用trimMargin()来删除空格

1
2
3
4
5
6
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()

默认为|用作边距前缀,可以选择另一个字符并将其作为参数传递,如trimMargin(“>”)

字符串模版(String Templates)

字符串可以包含模板表达式,前面介绍了可以使用${}模版表达式

1
2
val s = "abc"
val str = "$s.length is ${s.length}" //识别为 "abc.length is 3"

还有一种是可以使用$模版表达式

1
2
val i = 10
val s = "i = $i" // 识别为 "i = 10"

模版表达式同样可以用于由三个引号包裹的String,如下面的,${"$"}表示$符号

1
2
3
val price = """
${'$'}9.99
"""