禅与计算机程序设计艺术Kotlin精讲-黑马程序员(原创)Kotlin

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

2017-12-06  本文已影响174人  739c8d412b4c

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

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

上一篇下一篇

猜你喜欢

热点阅读