kotlin精讲-第5章(12)set集合-上
set集合介绍
set集合怎么定义呢?从概念角度去理解,set集合也叫set列表,存储的元素无序不可重复。无序,存入和取出的顺序不一定一致;不可重复,不可以存储重复数据,如果存储的数据有重复值,只有保留一个元素。我们经常利用“不可重复”特性对数据源进行“去重操作”。从代码角度去理解,set集合由Set接口和Set接口的实现类组成。
Set接口常用的实现类有哪些?HashSet、TreeSet和MutableSet。
HashSet不保证Set的迭代顺序,不保证顺序恒久不变。允许使用null元素。
HashSet遍历集合的时候,按照自然顺序递增的排序,也可以制定比较器。
set集合可以存储什么类型数据呢? set集合可以存储各种类型数据。可以存储诸如Int、Double、String等基本数据类型,也可以存储其他自定义对象类型,比如自定义的学生Student。
set集合3种创建方式
相比于list集合,Set接口没有提供构造方法,所以,不能通过Set的构造方法创建set集合。在Kotlin中创建set集合有4种方式,通过Kotlin给我们封装好的3个方法创建或者直接调用TreeSet的构造方法。如下表格,我们将这四种方式列举了出来。
创建set集合方法 | 返回值类型 | 是否可写 | 是否有序 |
---|---|---|---|
setOf ()方法 | Set | 否 | 无 |
hashSetOf ()方法 | HashSet | 是 | 无 |
mutableSetOf ()方法 | MutableSet | 是 | 无 |
TreeSet构造方法 | TreeSet | 是 | 有 |
我们可以直接看3种方式的对应方法的方法签名,重点看返回值,方法体的部分我直接去掉了,对应的源码如下:
作为了解,可以通过翻看源码得知4种创建集合方式上的细微差别,有的是通过Java里面的HashSet创建,有的是通过toSet方法转换为的set集合。这个意义不是很大。
更重要的是需要知道,通过setOf方法创建的set集合是不可写的,通过hashSetOf方法、mutableSetOf方法、TreeSet构造方法创建的集合是可写的。具体使用的时候,忘记是否可写怎么办?只需要点进去看看方法的返回值即可,返回Set不可写,返回HashSet、MutableSet则可写。或者,看每个方法的注释,返回只读的set集合,会出现“read-only set”字样。比如,我们查看setOf方法的源码注释:
我们通过代码演示集合的4种创建方式:
set集合的可写性验证以及转换
我们通过代码验证集合是否可写,先验证集合可写,参考代码:
我们再验证集合不可写,参考代码:
【代码清单-Set_可写性2不可写.kt】
但是,不可写集合可以通过totoMutableSet转换为可写集合,然后在进行写操作,参考代码:
set集合数据不可重复
set集合中的元素不可重复,是set相对于List的一个重要特点。同时,set集合中可以存储null元素,我们通过一个案例验证下set集合不可以包含重复元素,参考代码:
set集合数据无序
我们常说Set集合无序,应该怎么去理解呢?就是我们的Set接口,不保证加入和取出顺序一致。但是子接口会做一些保证。
HashSet内部存储的时候会根据元素的hashCode排序,元素取出的时候无序。
LinkedHashSet内部存储的时候也会根据元素的hashCode排序,但是使用链表存储,元素取出顺序和插入顺序一致。
TreeSet内部存储按照自然顺序对元素排序,但是对开发者不可见。
我们通过例子,演示下,set集合的无序性:
针对以上代码我们看到set1是无序输出。set2和set3则按照插入顺序输出。set4按照自然顺序输出(最具实际开发意义)。
set集合遍历
前面我们学习了区间、数组、list集合的遍历。那如何遍历set集合呢?set集合的遍历和list、数组的遍历一样。
也就是set集合在遍历的时候,可以普通的for循环,还可以for循环的时候调用withIndex方法,参考代码:
当然,还可以通过高阶函数进行遍历操作,这个我们后续再去讲解。