写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!
【Kotlin语言学习】系列文章
第一章 《认识Kotlin》
第二章 《数据类型》
第三章 《数据容器》
文章目录
- 【Kotlin语言学习】系列文章
- 一、数组
- (一)数组定义
- (二)原生类型数组
- (三)数组元素遍历
- 1.for循环遍历
- 2.forEach遍历
- 二、集合
- (一)集合分类
- 1.不可变集合
- 2.可变集合
- (二)集合定义
- 1.列表
- 2.集合
- 3.映射
- (三)集合操作
在 Kotlin 中,有多种数据容器可用于存储和组织数据。容器分为数组、集合。
一、数组
数组(Array),是指用于存储具有相同类型的固定长度元素序列的数据容器。Kotlin 的数组是不可变的,长度固定,不能添加或删除元素。
(一)数组定义
创建数组的方式有很多种。
首先就是通过arrayOf
来创建数组,其能够创建一个数组并传递元素给它,而其中的元素可以是任意类型。以下代码的JSON对象JSONObject
类型需要导入新的类,这里仅做示例。
val arr1 = arrayOf(1, 2, 3)
val arr2 = arrayOf(1, true, "2", JSONObject())// 内部的元素可以是任何类型
如果想要指定类型,则需要再声明制定的数据类型。
val arrInt: Array<Int> = arrayOf(1, 2, 3)// 指定类型为Int
同时,还可以使用arrayOfNulls
创建一个指定大小的,所有元素都为空的数组。但必须指定集合中的数据类型。构造完成,则可以使用索引操作符[]
访问每个元素,然后逐个给元素赋值。
val arrayOfNulls = arrOfNulls<String>(5)// 创建一个元素类型为字符串的5个元素的空数组
arrayOfNulls[0] = "element1"
arrayOfNulls[1] = "element2"
arrayOfNulls[2] = "element3"
arrayOfNulls[3] = "element4"
arrayOfNulls[4] = "element5"
除此之外,还可以用Array构造函数来创建数组,虽然比较少用,但还是予以介绍,其基本语法如下。
val numbers = Array(5) { index -> index * 2 } // 创建一个包含 5 个元素的数组,每个元素的值是索引值的两倍
这里的参数5
是数组的长度,{ index -> index * 2 }
是一个 lambda 表达式(下一章详细讲解),用于初始化数组的元素。在 lambda 表达式中,index 表示当前元素的索引。
(二)原生类型数组
原生类型数组(Primitive Type Arrays) 来使用指定的原生数据类型来表示数组的元素,而不是使用对应的包装类型。这种表示方式避免了自动装箱和拆箱的开销,可以直接在数组中存储原生数据类型的值。
原生类型数组函数 | 描述 |
---|---|
ByteArray() | 字节型数组 |
ShortArray() | 短整型数组 |
IntArray() | 整型数组 |
LongArray() | 长整型数组 |
FloatArray() | 浮点型数组 |
DoubleArray() | 双精度浮点型数组 |
CharArray() | 字符型数组 |
BooleanArray() | 布尔型数组 |
原生类型数组的创建和普通数组的定义基本相同。
val numbers = IntArray(5) // 创建一个包含5个整数元素的数组,初始值默认为0
val flags = BooleanArray(3) // 创建一个包含3个布尔元素的数组,初始值默认为0即false
val bytes = ByteArray(10) // 创建一个包含10个字节元素的数组,初始值默认为0
(三)数组元素遍历
遍历(iterate) 是指逐个访问数据结构中的元素或项的过程。在编程中,我们经常需要遍历数组、列表、集合或其他类型的数据结构来处理其中的元素。
遍历可以用于执行各种操作,例如打印元素、计算总和、查找特定元素、过滤元素等。这里可以使用for循环进行遍历。
1.for循环遍历
for (item in intArr) { // 元素遍历println(item)
}
其中item
代表变量intArr
中的每个元素。
同时,还可以通过indices
属性来获得创建的数组的索引。
for (i in intArr.indices) {println(i.toString() + "->" + intArr[i])
}
对于上面的代码,是通过在for循环的in
关键字访问每一个索引,从而达到的遍历效果。返回结果如下。
0->1
1->2
2->3
也可以使用带索引的方法来遍历。
for ((index, item) in intArr.withIndex()) {println("$index->$item")}
这种方式使用了withIndex()
函数获取了一个包含数组元素和索引的序列。然后再通过解构声明将元素和索引序列填入(index, item)
这两个变量中,随后输出。输出结果同上一个示例。
2.forEach遍历
forEach()
是 Kotlin 标准库中可用于遍历集合的函数。它接受一个 lambda 表达式作为参数,并使用 lambda 表达式对集合中的每个元素执行操作。这里就可以用forEach()
来遍历数组中的元素。
intArr.forEach{println(it)// 这里的it代表数组的元素,同样也是lambda表达式
}
二、集合
在 Kotlin 中,集合(Collections) 是一种常用的数据结构,用于存储多个元素。Kotlin 标准库提供了多种集合类型,每种类型在不同的使用场景下有不同的特点和优势。
(一)集合分类
集合分为不可变集合和可变集合。
1.不可变集合
不可变集合(Immutable Collections) 是指创建后不可进行添加、删除或修改等操作的集合。不可变集合是线程安全的,可以在多个线程中共享使用,因为不会发生并发修改的情况。
Kotlin 的标准库提供了以下不可变集合类型:
- 列表(List):是一个有序的集合,可以包含重复的元素,可通过索引(下标)访问元素。
- 集合(Set):是一个无序的集合,不能包含重复的元素,要求元素必须唯一。
- 映射(Map):是一种键值对的集合,每个元素由键和值组成。键是唯一的,值可以重复,类似其他语言中的字典数据类型。
要注意的是,不可变集合虽然无法直接进行元素的增删改操作,但可以通过操作符和函数进行集合操作,例如过滤、映射、排序等。
2.可变集合
可变集合(Mutable Collections) 是指在创建后可以进行添加、删除或修改等操作的集合。可变集合不是线程安全的,需要注意在多线程环境下使用时进行适当的同步。
Kotlin 的标准库提供了对应的可变集合类型:
- 可变列表(MutableList):可变的有序集合。
- 可变集合(MutableSet):可变的无序集合。
- 可变映射(MutableMap):可变的键值对集合。
通过可变集合的函数和操作符,可以对集合进行增删改操作,例如使用add()
添加元素,使用remove()
删除元素,使用索引进行修改等。
(二)集合定义
1.列表
对于不可变列表的创建,需要使用listOf
函数进行创建。其创建语法如下。
val list1: List<Int> = listOf(1, 2, 3, 4, 5)
不可变列表的元素是只读的,一旦创建,就不能通过索引来进行修改,也无法直接添加新元素。不可变列表的长度不可变,元素在创建后也不能更改。
而对于可变列表,则需要使用mutableListOf()
函数进行创建,其语法如下。
val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
不同于不可变列表,可变列表的长度和元素都可以在运行时进行更改。
val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2[0] = 10
println(list2) // 输出: [10, 2, 3, 4, 5]
或者使用add()
和remove()
等方法更改元素。
add()
用于在列表末尾添加一个元素。这个方法会修改原始列表。
val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2.add(6)
println(list2) // 输出: [1, 2, 3, 4, 5, 6]
remove()
用于删除列表中的指定元素。
val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2.remove(3)
println(mutableNumberList) // 输出: [1, 2, 4, 5]
2.集合
对于不可变列表的创建,需要使用setOf
函数进行创建。其创建语法如下。
val set1: Set<String> = setOf("apple", "banana", "orange")
而对于可变列表,则需要使用mutableSetOf()
函数进行创建,其语法如下。
val set2: MutableSet<String> = mutableSetOf("apple", "banana", "orange")
add()
用于在集合末尾添加一个元素。
val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2.add(6)
println(list2) // 输出: [1, 2, 3, 4, 5, 6]
但需要注意的是如果想要添加的元素已经在集合中出现,就无法再添加进去。
3.映射
对于不可变映射的创建,需要使用mapOf
函数进行创建。其创建语法如下。
val map1: Map<String, Int> = mapOf("apple" to 1, "banana" to 2, "orange" to 3)
可以看到,对于映射,需要同时定义键和值的数据类型,这里定义键的数据类型为字符串String
,值的数据类型为整型Int
;赋值也需要同时赋值键和值,首先赋值键,然后用to
关键字连接键值对,最后赋值值。这里“apple”、“banana” 和 “orange” 是键,它们分别映射到对应的值为1、2和3。
定义映射还可以用pair()
函数还创建一对数据,使得定义映射时不需要再使用to
关键字。
val map1: Map<String, Int> = mapOf(Pair("apple", 1),Pair("banana", 2),Pair("orange", 3)
)
而对于可变列表,则需要使用mutableMapOf()
函数进行创建,其语法如下。
val map2: MutableMap<String, Int> = mutableMapOf("apple" to 1, "banana" to 2, "orange" to 3)
mutableMap["apple"] = 4 // 修改值
mutableMap["grape"] = 5 // 添加新的键值对
(三)集合操作
集合操作是指对集合(如列表、集、映射等)进行常见的操作。在 Kotlin 中,标准库提供了丰富的集合操作函数,可以方便地操作集合数据。
操作函数 | 描述 | 示例 |
---|---|---|
isEmpty() | 判断集合是否为空 | set1.isEmpty() |
contains(元素) | 判断是否包含某元素 | set1.contains("6") |
get(索引) | 通过索引获取某元素 | set1.get(0) |
indexOf(元素) | 获取某元素首次出现的索引 | set1.indexOf("banana") |
lastIndexOf(元素) | 获取某元素最后出现的索引 | set1.lastIndexOf("apple") |
iterator() | 获取集合迭代器 | list1.iterator() |
add(元素) | 添加元素 | set1.add("grape") |
remove(元素) | 删除元素 | set1.remove("grape") |
addAll(集合) | 另一个集合添加此集合的所有元素 | set1.addAll(set2) |
removeAll(集合) | 另一个集合移除此集合的所有元素 | set1.removeAll(set2) |
retainAll(集合) | 另一个集合保留与此集合共有的元素 | set1.removeAll(set2) |
cleaer() | 清空集合所有元素 | set1.clear() |
set(索引, 元素 ) | 修改指定索引的元素 | set1.set(0, "grape") |
add(索引, 元素) | 指定位置添加元素 | list1.add(0, 6) |
removeAt(索引) | 指定位置删除元素 | list1.removeAt(0) |
reverse() | 反转集合中元素位置 | set1.reverse() |
shuffle() | 随机排列元素位置 | set1.shuffle() |
sort() | 从小到大排列元素位置 | set1.sort() |
我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!