Kotlin 笔记 3.9:数组和集合

数组

Kotlin 创建数组其实就是创建 Array<T> 类的实例,所以我们既可以通过 Array<T> 类的构造器来创建数组,也可以通过系统提供的工具函数来创建:

  • arrayOf()
  • arrayOfNulls()
  • emptyArray()

通过 Array 的构造函数创建数组
Array 类的构造函数如下:

    public inline constructor(size: Int, init: (Int) -> T)

第一个参数是数组大小,第二个参数是通过 Lambda 表达式来动态计算数组的元素:

fun main() {
    //创建数组,长度为3,从下标0开始,每个元素为 下标*2,因为是字符串数组,再通过 toString 转为 字符串
    var arr = Array<String>(3, {(it * 2).toString()})

    for (i in arr) {
        println(i)
    }
}
//执行结果:
0
2
4

Kotlin 还提供了其他一些用于创建原声数据类型数组的类:

  • ByteArray:创建字节型数组
  • ShortArray:创建短整型数组
  • IntArray:创建整型数组
  • LongArray:创建长整型数组
  • BooleanArray:创建布尔型数组
  • CharArray:创建字符型数组
  • FloatArray:创建浮点型数组
  • DoubleArray :创建双精度浮点型数组

每个原始数据类型都有一个对应的 toXxx() 方法可以转化为其它的类型

创建指定元素的数组
arrayOf() 方法用于创建指定元素的数组,类似于 Java 中的静态初始化:

fun main() {
    var arr = arrayOf("A","B","C")

    for (i in arr) {
        print("$i   ")
    }
}
//输出结果:A   B   C   

创建内容为空的数组
arrayOfNull() 用来创建元素为 null 的数组,因为事先没有元素存在,所以系统无法判断数组类型,需要我们显式声明:

fun main() {
    var arr = arrayOfNulls<String>(10)
    arr[5] = "张三"

    for (i in arr) {
        print("$i   ")
    }
}
//输出结果:null   null   null   null   null   张三   null   null   null   null   

创建内容为空,长度为0的空数组
我也不知道这玩意儿有啥用

遍历数组

跟 Java 一样,可以使用 for 循环来遍历数组

fun main() {
    var arr = arrayOf("A","B","C","D")
    for (str in arr){
        print("$str   ")
    }
}
//输出结果:A   B   C   D   

当然也可以通过下标来遍历:

fun main() {
    var arr = arrayOf("A","B","C","D")
    for (index in arr.indices){
        print("${arr[index] }  ")
    }
}
//输出结果:A  B  C  D  

集合

和 Java 一样,Kotlin 中的集合也有由 CollectionMap 两个接口派生出来的,但是和 Java 不同的是,在 Java 中,我们可以向集合中添加数据、删除数据、修改数据,而在 Kotlin 中,集合是分为 可变集合不可变集合两种,只有可变集合才可以增删改,而不可变集合只能获取数据。

为了区分可变和不可变,在 Kotlin 中 Collection 派生了 MutableCollection 子接口,而这个接口又派生了 MutableSetMutableList 两个接口,这两个接口派生的一系列实现代表了可变集合。

Collection 直接派生了 Set 和 List 两个接口,这两个接口派生的一系列实现代表可不可变接口。

Map 直接派生了 MutableMap,表示可变 Map

下图展示了 Kotlin 主要集合接口和类

Kotlin 在 JVM 平台上并没有真正实现 HashSet、LinkedHashSet、ArrayList 等这些类,而是直接借用了 Java 中的这些集合类,另外又添加了一些方法,让这些集合使用起来更加方便

Set

Set 集合是无序、不能重复、相同类型元素的构成的集合。

在 Kotlin 中,Set 集合的接口分为:

  • Set:不可变集合
  • MutableSet:可变集合
  • HashSet:Java 提供的实现类

创建不可变集合的方法:

  • setOf():创建内容为空的不可变 Set 集合
  • setOf(element: T):创建单个元素不可变的 Set 集合
  • setOf(vararg elements: T):创建多个元素的不可变 Set 集合,vararg 表明参数个数是可变的。

创建可变集合的方法:

  • mutableSetOf():创建空的可变 Set 集合
  • mutableSetOf(vararg elements: T):创建多个元素的可变的 Set 集合
  • hashSetOf():创建空的可变 HashSet 集合
  • hashSetOf(vararg elements: T):创建多个元素的可变的 HashSet 集合

因为它们是可变的,所以 MutableSet 接口提供了一些可以修改集合内容的方法:

  • add():增
  • remove():删
  • clear():清空

因为不可变 Set 集合并不是实现自 MutableSet 接口,所以没有这些可以修改集合元素的方法

List

List 集合是有序的、可以重复的、类型相同的数据集合。

在 Kotlin 中,List 和 Set 差不多,同样也是可变 List:MuableList 和 不可变 List:List,以及 Java 提供的 ArrayList 和 LinkedList。

创建可变 List 的方法:

  • mutableListOf()
  • mutableListOf(vararg elements: T)
  • arrayListOf()
  • arrayListOf(vararg elements: T)

创建不可变 List 的方法

  • listOf()
  • listOf(element:T)
  • listOf(vararg elements: T)

Map

Map 是使用 key/value 形式存储数据的集合类型,key 不允许重复,value 允许重复。

Kotlin 中的 Map 集合同样也分为可变和不可变:

创建不可变 Map 集合

  • mapOf()
  • mapOf(pair: Pair<K, V>)
  • mapOf(vararg pairs: Pair<K, V>)

创建可变 Map

  • mutableMapOf()
  • mutableMapOf(vararg pairs: Pair<K, V>)
  • hashMapOf()
  • hashMapIf(vararg pairs: Pair<K, V>)

这里只是列出了常用的 List 、Set 和 Map,像一些 LinkedList 之类的,因为不常使用,就不一一列举了。

List 和 Set 的区别