Kotlin号称全面兼容Java,因此,容器类在Kolin中是存在的。当然,Kotlin也对其新增了一些方法。下面开始进行介绍;
容器的基本操作
Kotlin也拥有三类基本的容器,分别是集合Set、队列List、映射Map。每类容器又分作只读和可变两种类型。只读就表明对于该容器只有读的能力,而增删改就必须使用可变的类型了。Kotlin规定每个变量在定义的时候必须指定是否能够修改。如定义var和val。容器也类似,默认的新容器都是只读容器,如果需要允许修改容器变量,就需要加上Mutable前缀形成新的容器,比如:MutableList、MutableMap、MutableSet,这三种都是可变容器。只有可变容器才能对其内部元素进行增、删、改操作。
这三种基本容器也拥有相同的容器方法,具体如下;
- isEmpty:判定该容器是否为空
- isNotEmpty:判断该容器是否非空
- clear:清空该容器
- contains:判定该容器是否包含指定元素
- iterator:获取该容器的迭代器
- count:获取该容器的元素个数,也可以通过size属性获得
kotlin允许在声明容器变量的时候就进行初始化赋值,如同对数组变量进行初始化一样。而java的容器类是无法同时声明并初始化的。
例: val nums:List = listOf(“1”,“2”,“3”,“4”)
容器 | 名称 | 初始方式 |
---|---|---|
只读集合 | Set | setOf |
可变集合 | MutableSet | mutableSetOf |
只读队列 | List | listOf |
可变队列 | MutableList | mutableListOf |
只读映射 | Map | mapOf |
可变映射 | MutableMap | mutableMapOf |
集合Set/MutableSet
集合的特性是无序,所以说不能通过下标来进行访问。且容器的内部存在唯一性,所以可以通过哈希值校验是否存在相同的元素,覆盖相应元素。
区别于java、,Set是只读集合,只具有读的权限,初始化赋值后便不可更改。所以元素变更的方法都是用于MutableSet。其有一下限制:
- MutableSet的add方法添加元素是不确定下标的,这是由于集合是无序的
- MutableSet没有修改元素值的方法,一旦确定,就不可被修改
- MutableSet的remove方法可以用于删除的指定元素。但是不能删除某个位置的元素,因为集合是无序的。
遍历方式有三种,for-in循环、迭代器循环、forEach遍历
1. for-in循环
val mutableSetOf = mutableSetOf<String>("1", "2", "3", "4")
for (i in mutableSetOf){
print("元素 $i")
}
2. 迭代器循环
val mutableSetOf = mutableSetOf<String>("1", "2", "3", "4")
val iterator = mutableSetOf.iterator()
while (iterator.hasNext()) {
val item = iterator.next()
println("元素 $item")
}
3. forEach遍历
val mutableSetOf = mutableSetOf<String>("1", "2", "3", "4")
mutableSetOf.forEach{
println("元素 $it")
}
总结: 在实战中存在诸多不足,主要是以下几点:
- 不允许修改内部元素的值
- 无法删除指定位置的元素
- 不能通过下标获取指定位置的元素
因此,大多数场合都是用的队列和映射
队列List/MutableList
队列是一种元素之间按照顺序排列的容器;相比于集合,队列多了次序管理。他有如下几点特性:
- 队列能够通过get方法获取指定位置的元素,也可以直接通过下标获得元素
- MutableList的add方法每次都是把元素添加到末尾,也可以指定添加的位置
- MutableList的set方法允许替换或者修改指定的位置元素
- MutableList的removeAt方法允许删除指定位置的元素
相比于集合,队列还多了一种按照元素下标循环遍历的方式:
val mutableListOf = mutableListOf("1", "2", "3")
for (i in mutableListOf.indices) {
val item = mutableListOf[i]
println("第 $i 个元素的内容是 $item")
}
映射Map/MutableMap
Kotlin的映射和java相同,每个元素的键和值都是一一对应的关系,相同键名只想的键值是唯一的,所以说映射中每个元素的键名各不相同,这个特性使得映射的变更操作与队列存在以下不同之处(MutableMap操作,Map只读)
- containsKey方法判断是否存在指定键名的元素,containsValue判断是否存在指定键值的元素
- put方法在添加的时候,会根据键名寻找同名元素,如果找不到就添加新元素,如果找得到就替换旧元素
- remove方法是通过键名来删除元素的
- 初始化隐射,有两种方式可以表达单个键值对元素。其一是”键名 to 键值,其二是采取Pair配对方式。代码如下
//两种方式在可读映射和可变映射都拥有
val mapOf = mapOf("1" to "one", "2" to "two", "3" to "three")
val mutableMapOf = mutableMapOf(Pair("1", "one"), Pair("2", "two"), Pair("3", "three"))
映射和集合的遍历差不多,但是元素不相同所以方式有点差异。代码如下
1. for-in循环
val mutableMapOf = mutableMapOf(Pair("1", "one"), Pair("2", "two"), Pair("3", "three"))
for (item in mutableMapOf){
println("键名 $item.key 键值$item.value")
}
2. 迭代器循环
val mapOf = mapOf("1" to "one", "2" to "two", "3" to "three")
val iterator = mapOf.iterator()
while (iterator.hasNext()) {
val item = iterator.next()
println("键名 $item.key 键值$item.value")
}
3. forEach遍历
val mapOf = mapOf("1" to "one", "2" to "two", "3" to "three")
mutableSetOf.forEach{ key, value ->
println("键名 $key 键值$value")
}
如果编写之间有问题,希望大家能够及时指正,谢谢!