目录
1. 集合概述
首先,Kotlin的集合只有两种类型,可变类型和不可变类型,可变类型是在不可变类型前面加上Mutable:
- List和MutableList<E
- Set 和 MutableSet
- Map<K, out V> 和 MutableMap<K, V>
他们的类图如下:
1. 集合分析
迭代器
首先,Iterable是所有集合的最上层,提供一个迭代器,可以看到iterator()
方法的前缀是operator(重载运算符必须覆盖的方法),原来该方法是重载for循环中in关键字。也就是说,只要实现了Iterable接口,就能用for…in来遍历。
public interface Iterable<out T> {
public operator fun iterator(): Iterator<T>
}
MutableIterable看起来跟Iterable相似:
public interface MutableIterable<out T> : Iterable<T> {
override fun iterator(): MutableIterator<T>
}
值得一提的是,MutableIterable类上面有一段说明:
Classes that inherit from this interface can be represented as a sequence of elements that canbe iterated over and that supports removing elements during iteration.
这说明MutableIterable支持在迭代的过程中删除元素。
抽象集合类
public interface Collection<out E> : Iterable<E> {
public val size: Int
public fun isEmpty(): Boolean
public operator fun contains(element: @UnsafeVariance E): Boolean
override fun iterator(): Iterator<E>
public fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean
}
值得注意的是contains方法用operator(重载运算符)修饰,所以它也是一种重载运算符,它重载了if判断中的in,也就是说重载contains才能使用if in。
基本只是一下普通的迭代,判断操作。而MutableCollection覆盖了Collection方法,并添加了一些操作集合的方法。
public interface MutableCollection<E> : Collection<E>, MutableIterable<E> {
override fun iterator(): MutableIterator<E>
public fun add(element: E): Boolean
public fun remove(element: E): Boolean
public fun addAll(elements: Collection<E>): Boolean
public fun removeAll(elements: Collection<E>): Boolean
public fun retainAll(elements: Collection<E>): Boolean
public fun clear(): Unit
}
具体集合类
这里从List角度去看看有方便的函数可以用。
public interface List<out E> : Collection<E> {
override val size: Int
override fun isEmpty(): Boolean
override fun contains(element: @UnsafeVariance E): Boolean
override fun iterator(): Iterator<E>
override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean
public operator fun get(index: Int): E
public fun indexOf(element: @UnsafeVariance E): Int
public fun lastIndexOf(element: @UnsafeVariance E): Int
public fun listIterator(): ListIterator<E>
public fun listIterator(index: Int): ListIterator<E>
public fun subList(fromIndex: Int, toIndex: Int): List<E>
}
MutableList只是多了一个removeAt方法
public fun removeAt(index: Int): E