1. 简介
Kotlin 提供了多种创建对象列表的方式。本文将重点介绍三种最常用的方法:使用 listOf()
、mutableListOf()
和 List()
构造函数。
掌握这几种方式后,你就能在实际项目中更灵活地✅ 初始化和管理对象列表。如果你经常处理集合操作,这些属于必须熟练掌握的基础技能,避免踩坑❌ 使用错误的列表类型导致运行时异常或不必要的性能开销。
相关阅读:Kotlin 集合详解
2. 使用 listOf()
listOf()
是创建不可变列表(immutable list)最直接的方式。它接收任意数量的元素作为参数,并返回一个只读列表。
data class Person(val name: String, val age: Int)
val people = listOf(
Person("Alice", 25),
Person("Bob", 30),
Person("Charlie", 35)
)
上面的例子中:
- 定义了一个
Person
数据类 - 使用
listOf()
创建包含三个Person
实例的列表
⚠️ 注意:虽然列表本身不可变(无法添加/删除元素),但其中的对象如果属性是 var
仍可修改。也就是说,不可变的是引用集合,而不是对象内容。
尝试执行 people.add(...)
会抛出 UnsupportedOperationException
。
3. 使用 mutableListOf()
当你需要后续动态修改列表时,应使用 mutableListOf()
。它的用法与 listOf()
几乎一致,但返回的是可变列表(MutableList),支持增删改操作。
data class Dog(val name: String, val age: Int)
val dogs = mutableListOf(
Dog("Buddy", 3),
Dog("Max", 5),
Dog("Lucy", 2)
)
此时你可以安全地对 dogs
进行操作:
dogs.add(Dog("Daisy", 4))
println(dogs) // [Dog(name=Buddy, age=3), Dog(name=Max, age=5), Dog(name=Lucy, age=2), Dog(name=Daisy, age=4)]
✅ 适用场景:
- 需要在循环中逐步添加元素
- 列表内容来自异步加载或多阶段处理
- 要支持用户交互导致的数据变更
更多操作参考:向 Kotlin 列表添加元素
4. 使用 List 构造函数
Kotlin 还提供了一种更具编程灵活性的方式——通过 List(size) { lambda }
构造器创建列表。它接受两个参数:
size
: 指定列表长度- 初始化 lambda:接收索引
index
,返回对应位置的元素
这种方式特别适合生成规则数据或批量初始化对象。
data class Car(val model: String, val price: Int)
val cars = List(3) { index ->
Car("Car ${index + 1}", (index + 1) * 100)
}
最终结果等价于:
[
Car(model="Car 1", price=100),
Car(model="Car 2", price=200),
Car(model="Car 3", price=300)
]
✅ 优势:
- 支持基于索引的动态构造
- 一行代码完成批量实例化
- 更适合函数式风格编程
⚠️ 注意:这个构造函数默认创建的是 只读列表(ReadOnlyList)。即使你试图转成 MutableList,原始返回值仍是 immutable。
如果你想得到可变版本,可以链式调用 .toMutableList()
:
val mutableCars = List(3) { index ->
Car("Car ${index + 1}", (index + 1) * 100)
}.toMutableList()
5. 总结
方法 | 是否可变 | 适用场景 |
---|---|---|
listOf() |
❌ 不可变 | 固定数据、配置项、常量列表 |
mutableListOf() |
✅ 可变 | 动态增删、运行时构建 |
List(size){} |
默认不可变 | 规则数据生成、索引相关初始化 |
📌 核心建议:
- 大多数情况下优先使用
listOf()
或mutableListOf()
,简洁直观 - 当需要根据索引或其他逻辑批量生成对象时,
List()
构造函数是更优雅的选择 - 始终遵循“最小权限”原则:不需要修改就用不可变列表,提升代码安全性与可读性
所有示例代码已上传至 GitHub:Baeldung Kotlin 教程仓库
邮箱联系:support@baeldung.com