在 Android 开发(尤其是 Kotlin 环境)中,Collection(集合)本质上就是用来存储和操作一组数据的容器。它主要分为 List(列表)、Set(集合) 和 Map(映射) 三大类。
1. 在早期的java语法中List,Set和Map的主要区别可以按下面的简单理解:
- List是有序的,可重复的集合,主要代表ArrayList,例如"苹果","橘子","香蕉","橘子","菠萝",其中2个"橘子"都会存在这个集合中,而且顺序会保持
- Set是无序的,不可重复的集合,主要代表是HashSet,例如"苹果","橘子","香蕉","橘子","菠萝",最后保存后,重复的橘子就会只有一个元素,可以理解合并了,最后这个Set只有4个元素
- Map是以键值对的形式保存的,也就是key-value的形式,key是不重复的,例如:apple-苹果,orange-橘子,banana-香蕉,可以通过apple的key获取到苹果的值
在实际开发中,通常会从可变性和数据来源两个维度来划分:
2. 按可变性划分(Kotlin 核心特性)
Kotlin 对集合做了严格的只读与可变区分,这在现代 Android 开发中非常有利于数据安全和状态管理:
- 只读集合(Immutable):如
List<T>、Set<T>、Map<K, V>。它们没有add、remove等修改方法,通常用于 UI 层的数据展示或跨层传递,能有效避免并发修改异常。 - 可变集合(Mutable):如
MutableList<T>、MutableSet<T>、MutableMap<K, V>。继承了只读接口并增加了增删改方法,适合在 ViewModel 或 Repository 中进行数据加工。
3. 按数据来源与线程安全划分(Android 特有)
- 内存集合:即上述标准的 Kotlin/Java 集合(如
ArrayList、HashMap),数据完全驻留在内存中。 - 响应式集合:如 Jetpack 提供的
StateList(Experimental)或配合 Flow 使用的集合。它们能感知生命周期和状态变化,常用于 Compose 等现代 UI 框架中驱动界面刷新。 - 持久化/数据库集合:如 Room 数据库查询返回的集合。它们通常以
Flow<List<T>>或LiveData<List<T>>的形式存在,数据来源于磁盘,具备线程安全和生命周期感知能力。
三大核心类型对比
| 类型 | 特点 | 常见实现类 |
|---|---|---|
| List | 有序、可重复。可以通过索引(下标)访问元素。 | ArrayList, LinkedList, mutableListOf() |
| Set | 无序、不可重复。常用于数据去重或判断元素是否存在。 | HashSet, TreeSet, mutableSetOf() |
| Map | 键值对(Key-Value)存储。Key 不可重复,通过 Key 获取 Value。 | HashMap, TreeMap, mutableMapOf() |
在 Android 开发中,选择哪种集合通常取决于业务场景:需要保持数据顺序且允许重复用 List;需要去重用 Set;需要通过唯一标识查找数据用 Map。同时,尽量优先使用 Kotlin 标准库提供的扩展函数(如 filter、map、forEach)来操作集合,代码会更加简洁高效。