多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## [Set](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html#set)接口 [TOC] ### Set接口简介 ``` interface Set<out E> : Collection<E> ``` Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,但并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,**Set接口中的元素是无序的,并且元素不可重复,重复的元素只会被记录一次**。 在Kotlin中,Set分为可变集合MutableSet与不可变集合Set,其中可变集合MutableSet是对集合中的元素进行增加和删除的操作,不可变集合Set对集合中的元素仅提供只读的操作。 ### Set接口的继承结构 可参看官方网站set的继承[Inheritors](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html#inheritors) ``` interface Set<out E> : Collection<E> ``` #### AbstractSet [AbstractSet](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-abstract-set/index.html#abstractset) ``` abstract class AbstractSet<out E> : AbstractCollection<E>, Set<E> ``` #### MutableSet [MutableSet](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-set/index.html#mutableset) ``` interface MutableSet<E> : Set<E>, MutableCollection<E> ``` * 继承[Inheritors](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-set/index.html#inheritors) ##### AbstractMutableSet [AbstractMutableSet](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-abstract-mutable-set/index.html) ``` abstract class AbstractMutableSet<E> : MutableSet<E> ``` ##### HashSet [HashSet](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-hash-set/index.html#hashset) ``` class HashSet<E> : MutableSet<E>, AbstractMutableCollection<E>, KonanSet<E> ``` ##### LinkedHashSet [LinkedHashSet](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-linked-hash-set/index.html#linkedhashset) ``` typealias LinkedHashSet<V> = HashSet<V> ``` `Set`的默认实现 -[`LinkedHashSet`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-linked-hash-set/index.html)– 保留元素插入的顺序。 因此,依赖于顺序的函数,例如`first()`或`last()`,会在这些`set`上返回可预测的结果。 ``` fun main() { //sampleStart val numbers = setOf(1, 2, 3, 4) // LinkedHashSet is the default implementation val numbersBackwards = setOf(4, 3, 2, 1) println(numbers.first() == numbersBackwards.first()) println(numbers.first() == numbersBackwards.last()) //sampleEnd } ``` 运行结果 ``` false true ``` 另一种实现方式 –[`HashSet`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-hash-set/index.html)– 不声明元素的顺序,所以在它上面调用这些函数会返回不可预测的结果。但是,`HashSet`只需要较少的内存来存储相同数量的元素。 ### 不可变Set 不可变Set同样是继承了Collection接口,调用标准库中的setOf()函数来创建不可变Set集合,具体代码如下: ``` val mSet = setOf(1, 8, 9, 1, 4, 7, 9, 0, 0, 8) println(mSet) ``` 由于Set集合中的元素具有不可重复性,因此上述代码的运行结果如下: ``` [1, 8,9, 4, 7, 0] ``` 不可变集合Set与不可变集合List类似,都是一个只提供只读操作的集合,并且Set集合中的操作与List集合也类似,Set集合的主要操作有查询操作与批量操作。 #### 查询操作 Set集合的查询操作主要有判断集合是否为空、获取集合中元素的数量、判断集合中是否包含某一个元素以及返回集合中的元素的迭代器,如表所示。 ![](https://img.kancloud.cn/b1/91/b19183727a55d0061a137a3bc6933178_1371x265.png) #### 批量操作 Set集合中的批量操作的方法只有containsAll(elements:Collection<@UnsafeVariance E>),这个方法的含义是判断集合中是否包含某一个集合。 >[success]注意:**Set集合中也可以进行List集合中的修改操作(Set集合没有set之类的方法修改元素)和迭代器([iterator](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-hash-set/iterator.html#iterator))操作**,由于这两个操作与List集合中内容一样,因此就不再重复写一遍了,大家可以根据List接口中的方法来理解Set集合,区别在于set集合元素不可重复。 ### 可变MutableSet MutableSet接口继承于Set接口与MutableCollection接口,同时对Set接口进行扩展,在该接口中添加了对集合中元素的添加和删除等操作。可变MutableSet集合是使用mutableSetOf()函数来创建对象的,具体代码如下: ``` val muSet: MutableSet<Int> = mutableSetOf(1, 2, 3) ``` 上述代码中创建了一个可变的MutableSet集合,该集合中的操作主要有查询操作、修改操作、批量操作以及迭代器,由于这些操作与MutableList集合中的操作比较类似,因此只例举修改操作即可,其他操作可以参考MutableList集合与MutableSet接口中的方法来理解。 MutableSet集合可以对该集合中的元素进行修改操作,这些修改操作主要有向集合中添加元素与移除集合中的元素,如表所示。 ![](https://img.kancloud.cn/0e/c7/0ec7de3a37715eec95e4574ca1b0543a_1372x187.png)