回到目录
项目源码 kotlin-basics 项目
本节将描述 Kotlin 中使用的基本类型: 数字, 字符, 布尔值, 数组, 字符串.
数字
Kotlin 中有 6 种内置的类型来表示数字:
类型 | 位宽 |
---|---|
Byte | 8 |
Short | 16 |
Int | 32 |
Long | 64 |
Float | 32 |
Double | 64 |
Char 类型在 kotlin 中不是数值哦!
进制
Kotlin 中有十进制, 二进制, 十六进制, 没有八进制
二进制用 0b
表示, 例如 0b1011
十六进制用 0x
表示, 例如 0xFF
Byte
Byte 的宽度是 8 位, 所以它的取值范围是 [-128, 127]; 在这个范围用 Byte 类型变量
会比较节省内存.
@Test
fun testByte() {
var count: Byte = 100
assertEquals(100, count)
}
Short
Short 的宽度是 16 位, 所以取值范围是 [-32768, 32767].
@Test fun testShort() {
// 这里用 _ 使数值可读性更好, 一下就能看出是 3 万
val total: Short = 3_0000
assertEquals(30000, total)
}
Int
Int 的宽度 32 位, 取值范围很大, 基本够用, 2 的 32 次方嘛.
@Test fun testInt() {
// 3 亿
// 默认 Int
var num = 3_0000_0000
assertEquals(3_0000_0000, num)
// 使用 is 关键字来判断类型
assertTrue(num is Int)
}
Long
Long 宽度是 64, 只有 Int 不够用了才考虑它, 取值范围更大; Long 类型的数值后要加
L
为 Long 类型对象, 否则会当成 Int.
@Test fun testLong() {
// 后面要加 L
var bigNum: Long = 3_0000_0000_0000_0000L
assertEquals(3_0000_0000_0000_0000L, bigNum)
}
Float
Float 宽度是 32 位的, 数值后需要加 F
标记一下, 否则会当成 Double 类型.
@Test fun testFloat() {
// 标记了 f, 就可以省略类型了, 因为编译器可以推断出来
var pi = 3.1415926f
assertEquals(3.1415926f, pi)
assertTrue(pi is Float)
// assertTrue(pi is Double) // 编译就报错了
}
Double
Double 宽度是 64 位的, 是小数类型的默认类型.
@Test fun testDouble() {
// 默认 Double 类型
var pi = 3.14
assertEquals(3.14, pi)
assertTrue(pi is Double)
}
字符
Char 类型表示字符, 用单引号 ''
包裹. 例如 '1', 'a'
. 特殊字符可以用反斜杠转义.
'\t'
, '\b'
, '\n'
, '\r'
, '\''
, '\"'
, '\\'
, '\$'
字符用 Unicode 编码表示: '\uFF00'
布尔值
Boolean 类型表示布尔值, 有两个值 true
, false
数组
Array 类型表示数组. 有操作符 []
重载的 get()
, set()
方法, 有 size
属性.
Array 源码如下:
package kotlin
public class Array {
public inline constructor(size: Int, init: (Int) -> T)
public operator fun get(index: Int): T
public operator fun set(index: Int, value: T): Unit
public val size: Int
public operator fun iterator(): Iterator
}
可以用内置的 arrayOf()
系列函数来创建一个数组. 比如 intArrayOf
.
实例:
@Test fun testArray() {
val names: Array = arrayOf("codergege", "张三", "李四")
val ages = intArrayOf(11, 22, 33) // 类型推断 Array
// 数组有 size 属性
assertEquals(3, names.size)
// get, set 使用 [] 操作符重载了
assertEquals(11, ages[0])
}
字符串
String 类型表示字符串, 它跟数组很像, 但字符串是不可变的(没有 set()
方法).
有 length
属性, 用 []
取出字符
用 ""
包裹的字符串字面量中, 可以进行转义.
var name: String = "codergege" // 即使用 var 来声明, String 变量 name 仍然是不可变对象.
// 可以取出单个字符
assertTrue(name[0] == 'c')
// name[0] = 'C' // 编译不通过, String 是不可更改的
// 可以转义
var book = "kotlin\tin\taction"
// 打印看看
println(book)
用三个引号来表示 "raw string". 里面是不能包含转移字符的, 因为不需要. 但是如果想
加入 $
符, 得用 ${'$'}
来表示. 下面马上会讲到字符串模板.
// Raw string
val words = """
I'm codergege.
Kotlin is a lot of funs.
Ok~~ ${'$'}
""".trimIndent() // 把缩进给去掉了
// 打印看看效果
println(words)
打印结果是:
I'm codergege.
Kotlin is a lot of funs.
Ok~~ $
字符串模板
Kotlin 中可以使用字符串模板, 又一个十分方面的特性, 用途广泛.
传统字符串和原始字符串中都可以使用模板, 这也是为什么原始字符串中需要用 ${'$'}
来表示 $
的原因.
直接看实例:
// 字符串模板
val myname = "codergege"
val age = 28
val hello = "我叫 $myname, 今年已经 ${age - 10} 岁了"
assertEquals("我叫 codergege, 今年已经 18 岁了", hello)
普通的变量可以直接 $myname
这么用, 表达式得用 ${}
.
回到目录