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。

小技巧:Kotlin 支持数字字面量加下划线,比如 val million = 1_000_000。这在处理大数字时特别有用,一眼就能看出数值大小。

3.2 布尔与字符:简单但容易踩坑

布尔类型就两个值:truefalse。但 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 ba or ba 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 的每一位代表一个权限,通过 andor 来组合判断。我在做网络协议解析时也经常用到位运算,效率比算术运算高得多。

知识体系总览

下面这张图把本章的核心知识点串起来了。你可以看到,基本数据类型从数字出发,延伸到布尔、字符、字符串和数组,而类型转换和位运算则是贯穿其中的实用工具。

Kotlin 基本数据类型 数字类型 Byte, Short, Int, Long Float, Double 字面量支持下划线 布尔 & 字符 Boolean: true / false Char: 单引号字符 短路求值特性 字符串 字符串模板 $ 多行字符串 """ trimIndent() 去缩进 数组 Array<T> 对象数组 IntArray 基本类型 带初始化器创建 类型转换 显式转换:.toInt() .toLong() 安全转换:toIntOrNull() 浮点转整数直接截断 位运算 and / or / xor / shl / shr 标志位处理常用 无符号右移 ushr

好了,这一章的内容就到这里。基本数据类型是 Kotlin 的基石,看似简单,但每个细节都值得你亲手敲一遍代码试试。尤其是类型转换和位运算,平时用得不多,但一旦遇到性能瓶颈或底层操作,它们就是你的杀手锏。


公众号:蓝海资料掘金营,微信deep3321