kotlin精讲-第5章(12)set集合-上

作者: 739c8d412b4c | 来源:发表于2017-12-06 16:11 被阅读174次

    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方法,参考代码:

    当然,还可以通过高阶函数进行遍历操作,这个我们后续再去讲解。

    相关文章

      网友评论

        本文标题:kotlin精讲-第5章(12)set集合-上

        本文链接:https://www.haomeiwen.com/subject/oyclixtx.html