3. 基本数据类型:数字、布尔、字符、字符串、数组、类型转换与位运算
聊到 Kotlin 的基本数据类型,我其实挺感慨的。早些年用 Java 写代码,动不动就要纠结用 int 还是 Integer,空指针问题更是家常便饭。Kotlin 在这方面做得相当干脆——一切皆对象,但又保留了底层性能。说白了,它让你写得更爽,跑得也快。
3.1 数字类型:不只是 Int 和 Long
Kotlin 的数字类型和 Java 基本对应,但有个关键区别——所有数字都是对象。这意味着你可以直接调用 1.toString() 或者 3.14.toInt(),这在 Java 里得靠包装类才能做到。
| 类型 | 位宽 | 取值范围 |
|---|---|---|
| Byte | 8 | -128 ~ 127 |
| Short | 16 | -32768 ~ 32767 |
| Int | 32 | -2^31 ~ 2^31-1 |
| Long | 64 | -2^63 ~ 2^63-1 |
| Float | 32 | 约 ±3.4E38(6-7位有效数字) |
| Double | 64 | 约 ±1.7E308(15-16位有效数字) |
我个人习惯在定义常量时用 val 配合类型推断。比如 val age = 30 默认就是 Int。如果需要 Long,记得加 L 后缀:val big = 100L。浮点数也一样,val pi = 3.14f 是 Float,不加 f 就是 Double。
val million = 1_000_000。这在处理大数字时特别有用,一眼就能看出数值大小。
3.2 布尔与字符:简单但容易踩坑
布尔类型就两个值:true 和 false。但 Kotlin 的布尔运算有个特点——短路求值。比如 a && b,如果 a 是 false,b 根本不会执行。我在项目中遇到过因为依赖短路求值而漏掉边界检查的情况,后来就养成了显式判断的习惯。
字符类型 Char 用单引号,比如 'A'、'9'。它不能直接当作数字用,这点和 Java 不同。我曾经看到有人写 '1' + 1 想得到 2,结果编译报错——嗯,Kotlin 不允许这种隐式转换,你得用 '1'.digitToInt() 才行。
3.3 字符串:模板表达式是真香
Kotlin 的字符串最让我喜欢的就是字符串模板。以前在 Java 里拼字符串,要么用 + 号连,要么用 String.format(),写起来又长又容易出错。Kotlin 直接 "Hello, $name" 搞定,复杂表达式还能用 ${} 包裹。
val name = "Kotlin"
val year = 2024
println("$name 发布于 ${year - 13} 年前") // 输出:Kotlin 发布于 2011 年前
多行字符串用三个引号 """ 包裹,非常适合写 SQL 或 JSON 模板。不过要注意,trimIndent() 可以帮你去掉公共缩进,否则输出会带着代码里的空格。
$ 符号拼接变量,结果发现 $ 被当成了模板标记。解决办法是用 \$ 转义,或者用 ${'$'} 这种骚操作。
3.4 数组:两种创建方式
Kotlin 的数组分两种:Array<T> 和基本类型数组(如 IntArray)。前者是对象数组,后者是原始类型数组,性能更好。我个人建议:处理大量数值时用基本类型数组,否则用 Array 更灵活。
// 对象数组
val arr1 = arrayOf(1, 2, 3)
// 基本类型数组
val arr2 = intArrayOf(1, 2, 3)
// 带初始化器的数组
val arr3 = Array(5) { it * it } // [0, 1, 4, 9, 16]
你想想看,Array(5) { it * it } 这种写法多简洁。在 Java 里你得先 new 一个数组,再写个 for 循环赋值。Kotlin 一行搞定,而且 it 就是当前索引,省去了定义变量的麻烦。
3.5 类型转换:显式才安全
Kotlin 没有隐式类型转换。你不能把 Int 直接赋值给 Long,必须显式调用 .toLong()。一开始我觉得麻烦,后来发现这其实避免了大量隐蔽的精度丢失问题。
val x: Int = 10
// val y: Long = x // 编译错误
val y: Long = x.toLong() // 正确
字符串转数字也是常见操作。用 "123".toInt() 就行,但如果字符串格式不对会抛异常。我习惯用 toIntOrNull(),返回 null 时再处理,这样更安全。
3.99.toInt() 结果是 3。需要四舍五入的话用 Math.round()。
3.6 位运算:性能优化的利器
位运算在 Kotlin 里用中缀函数表示,不再是 Java 的 &、| 这种符号。比如 a and b、a or b、a shl 2。说实话,刚开始我不太习惯,但用久了发现可读性确实更好。
| 操作 | Kotlin 写法 | Java 写法 |
|---|---|---|
| 按位与 | a and b |
a & b |
| 按位或 | a or b |
a | b |
| 异或 | a xor b |
a ^ b |
| 左移 | a shl 2 |
a << 2 |
| 右移 | a shr 2 |
a >> 2 |
| 无符号右移 | a ushr 2 |
a >>> 2 |
位运算最常见的场景是标志位处理。比如一个权限系统,用 Int 的每一位代表一个权限,通过 and 和 or 来组合判断。我在做网络协议解析时也经常用到位运算,效率比算术运算高得多。
知识体系总览
下面这张图把本章的核心知识点串起来了。你可以看到,基本数据类型从数字出发,延伸到布尔、字符、字符串和数组,而类型转换和位运算则是贯穿其中的实用工具。
好了,这一章的内容就到这里。基本数据类型是 Kotlin 的基石,看似简单,但每个细节都值得你亲手敲一遍代码试试。尤其是类型转换和位运算,平时用得不多,但一旦遇到性能瓶颈或底层操作,它们就是你的杀手锏。