Kotlin 标准库提供了一整套用于管理集合的工具,集合是可变数量 (可能为零)的一组条目,各种集合对于解决问题都具有重要意义,并且经常用到。
集合是大多数编程语言的常见概念,因此如果熟悉像 Java 或者 Python 语言的集合,那么可以跳过这一介绍转到详细部分。
集合通常包含相同类型(及其子类型)的一些对象。集合中的对象称为元素或条目。例如,一个系的所有学生组成一个集合,可以用于计算他们的平均年龄。
以下是 Kotlin 相关的集合类型:
- List 是一个有序集合,可通过索引(反映元素位置的整数)访问元素。 元素可以在 list 中出现多次。列表的一个示例是电话号码:有一组数字、这些数字的顺序很重要并且数字可以重复。
- Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,the numbers on lottery tickets form a set: they are unique, and their order is not important.
- Map(或者字典)是一组键值对。键是唯一的,每个键都刚好映射到一个值。 值可以重复。map 对于存储对象之间的逻辑连接非常有用,例如,员工的 ID 与员工的位置。
Kotlin 让你可以独立于所存储对象的确切类型来操作集合。换句话说,将
String
添加到 String
list 中的方式与添加 Int
或者用户自定义类的到相应 list 中的方式相同。
因此,Kotlin 标准库为创建、填充、管理任何类型的集合提供了泛型的(通用的,双关)接口、类与函数。
这些集合接口与相关函数位于 kotlin.collections
包中。我们来大致了解下其内容。
Arrays are not a type of collection. For more information, see Arrays.
{type="note"}
Kotlin 标准库提供了基本集合类型的实现: set、list 以及 map。 一对接口代表每种集合类型:
- 一个 只读 接口,提供访问集合元素的操作。
- 一个 可变 接口,通过写操作扩展相应的只读接口:添加、删除及更新其元素。
Note that a mutable collection doesn't have to be assigned to a var
. Write operations with
a mutable collection are still possible even if it is assigned to a val
. The benefit of assigning mutable collections to
val
is that you protect the reference to the mutable collection from modification. Over time, as your code grows and becomes
more complex, it becomes even more important to prevent unintentional modification to references. Use val
as much as possible
for safer and more robust code. If you try to reassign a val
collection, you get a compilation error:
fun main() {
//sampleStart
val numbers = mutableListOf("one", "two", "three", "four")
numbers.add("five") // 这是可以的
println(numbers)
//numbers = mutableListOf("six", "seven") // 编译错误
//sampleEnd
}
{kotlin-runnable="true" kotlin-min-compiler-version="1.3"}
只读集合类型是型变的。
这意味着,如果类 Rectangle
继承自 Shape
,则可以在需要 List <Shape>
的任何地方使用 List <Rectangle>
。
换句话说,集合类型与元素类型具有相同的子类型关系。 map 在值(value)类型上是型变的,但在键(key)类型上不是。
反之,可变集合不是型变的;否则将导致运行时故障。 如果 MutableList <Rectangle>
是 MutableList <Shape>
的子类型,你可以在其中插入其他 Shape
的继承者(例如,Circle
),从而违反了它的 Rectangle
类型参数。
下面是 Kotlin 集合接口的图表:
让我们来看看接口及其实现。 To learn about Collection
, read the section below.
To learn about List
, Set
, and Map
, you can either read the corresponding sections or watch a video
by Sebastian Aigner, Kotlin Developer Advocate: