Kotlin数据容器深入讲解
作者:Ken' 发布时间:2022-03-28 05:19:34
前言
容器是用于存放数据的载体。容器分为数组、集合。 Kotlin 作为一门全新的语言,肯定还是要有自己的容器类,不然哪天 Java 跟 Kotlin 划清界限,那麻烦就大了。 Kotlin 也拥有三类基本的容器,分别是集合 Set、队列 List、映射 Map,每种 容器又分作只读与可变两种类型这是为了判断该容器能否进行增删改等变更操作。
• Kotlin 数组
• Kotlin 集合
一、Kotlin数组
数组是一种初始化时指定容器大小,不可以动态调整其大小的容器。元素按 顺序存储在一串连续的内存段上。
1、Kotlin数组创建技巧
arrayOf 创建数组
创建一个数组并传递元素值给它, 集合中的元素可以是任意类型
val array = arrayOf(1, 2, 3)
val array = arrayOf(1, true, "2", JSONObject()) // 集合中的元素可以是任意
类型
arrayOfNulls 创建数组
创建一个指定大小的、所有元素都为空的数组,但必须指定集合中的元素类型
val arrayOfNulls = arrayOfNulls<String>(5) //创建一个指定大小的、所有元素
都为空的数
动态创建数组
用接受数组大小以及一个方法参数的 Array 构造方法,用作参数的方法能够 返回给定索引的每个元素初始值:
// 创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }
2、原生类型数组
在 Kotlin 中也有无装箱开销的专门的类来表示原生类型数组:
IntArray 函数
// 1.创建并初始化一个 IntArray [1, 2, 3, 4, 5]
val intArray = IntArray(1, 2, 3, 4, 5)
// 2.创建一个长度为 5 的空的 IntArray
val intArray2 = IntArray(5)
// 3.创建一个长度为 5 的值全为 100 的 IntArray [100, 100, 100, 100, 100]
val intArr2 = IntArray(5) { 100 }
// 4.注意这里 it 是它索引下标值,所以这是创建一个长度为 5 的 IntArray [0, 2, 4,
6, 8]
val intArr3 = IntArray(5) { it * 2
Tips
在 Kotlin 数组类型不是集合中的一种,但是它又和集合有着太多相似的地 方。 数组和集合可以互换初始化集合的时候可以传入一个数组
3、数组常见的操作
获取元素
val array =arrayOf(1,2,3,4,5)
array[index] // 获取数组的第 index 个元素,下标从 0 开始
array.component1() … arr.component5()获取数组的前 5 个元素。同样适用于集合
for 循环——元素遍历
for (item in array) { // 元素遍历
println(item)
//1
//2
//3
//4
//5
}
for 循环——下标遍历
for (i in array.indices) { // 根据下标再取出对应位置的元素
println(i.toString() + "->" + array[i])=
//0->1
//1->2,
//2->3,
//3->4,
//4->5
}
forEach 遍历数组
array.forEach {
println(it)
//1
//2
//3
//4
//
}
forEach 增强版
array.forEachIndexed { index, item ->
println("$index:$item")
//0:1
//1:2
//2:3
//3:4
//4:5
}
数组翻转
array.reverse()
>> println(array) = 5,4,3,2,1
二、Kotlin集合
Kotlin 标准库提供了一整套用于管理集合的工具,集合是可变数量(可能为 零)的一组条目,各种集合对于解决问题都具有重要意义,并且经常用到。 与数组不同的是可变集合的大小可以动态改变。
• List: 是一个有序集合,可通过索引(反映元素位置的整数)访问元 素。元素可以在 list 中出现多次。列表的一个示例是一句话:有一组 字、这些字的顺序很重要并且字可以重复。
• Set: 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重 复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字 母的集合(set)。
• Map:(或者字典)是一组键值对。键是唯一的,每个键都刚好映射到 一个值,值可以重复。
1、集合创建的技巧
集合分为
可变集合,显而易见,是指集合创建完成之后,可以对集合进行增 删改查操作
不可变集合,显而易见,是指指集合创建完成之后,不能对集合进行增删改 查操作,会抛异常。
List 队列
队列是一种元素之间按照顺序排列的容器,它与集合的最大区别,便是多了 个次序管理。不要小看这个有序性,正因为队列建立了秩序规则,所以它比 集合多提供了如下功能(注意凡是涉及到增删改的,都必须由 MutableList 来 完成):
• 不可变集合
val strings = listOf("one", "two", "one") // 不可以对 strings 进行增删改查操作
• 可变集合
val numbers = mutableListOf<Int>(1, 2, 3, 4) // 可以对 numbers 进行增删改查
操作
val numbers = arrayListOf<Int>(1, 2, 3
Tips
不难发现,每个不可变集合都有对应的可变集合,也就是以 mutable 为前缀 的集合。
• 不可变的 List 类型集合的初始化使用:listOf 函数
• 可变的 List 类型集合的初始化使用:mutableListOf 函数
Set 集合
1、容器内部的元素不按顺序排列,因此无法按照下标进行访问;
2、容器内部的元素存在唯一性,通过哈希值校验是否存在相同的元素,如果 存在则覆盖之;
• 不可变集合
val hello = setOf("H", "e", "l", "l", "o")//自动过滤重复元素
>> println(hello) = H", "e", "l","w", "o"
• 可变集合
val hello = mutableSetOf("H", "e", "l", "l", "o") //自动过滤掉重复元素
>> println(hello) = H", "e", "l","w", "o", "r", "l", "d
Tips
• 不可变的 set 类型集合的初始化使用:setOf 函数
• 可变的 set 类型集合的初始化使用:mutableSetOf 函数
Map 字典
映射内部保存的是一组键值对(Key-Value),也就是说,每个元素都由两部 分构成,第一部分是元素的键,相当于元素的名字;第二部分是元素的值, 存放着元素的详细信息。元素的键与值是一一对应的关系,相同的键名指向 的值对象是唯一的,所以映射中每个元素的键名各不相同,这个特性使得映射的变更操作与队列存在以下不同之处(注意增删操作必须由 MutableMap 来完成):
• 不可变集合
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to
1)
>> println("${numbersMap.keys}")= key1,key2,key3,key4
>> println("${numbersMap.values}") = 1,2,3,1
• 可变集合
val numbersMap = mutableMapOf("key1" to 1, "key2" to 2, "key3" to 3,
"key4" to 1)
>> println("${numbersMap.keys}")= key1,key2,key3,key4
>> println("${numbersMap.values}") = 1,2,3,1
Tips
• 不可变的 map 类型集合的初始化使用:mapOf 函数
• 可变的 map 类型集合的初始化使用:mutableMapOf 函数
2、集合的操作
增删改查
val stringList = listOf("one", "two", "one") 以 list 集合为例,set,map 同样
具备以下能力
numbers.add(5) // 集合最后面添加元素 5
numbers.addAt(1,5) // 向下标为 1 的位置,添加元素 5,下标为 1 及之后位置的
元素,以此后移
numbers.remove("one") // 删除元素“one”
numbers.removeAt(1) // 删除下标为 1 的元素
numbers.set(0) = 0 // 下标为 0 的元素设置为 0
numbers.get(0)==>1 // 获取下标为 0 的元素,结果为
变换操作
在 Kotlin 中提供了强大对的集合排序的 API,让我们一起来学习一下:
来源:https://blog.csdn.net/m0_58941767/article/details/126785386
猜你喜欢
- 1. 测试文档、期望达到的目标文档效果用于测试的Word文档如下所示,包含的空白段落影响文章整体布局及美观性:目标文档效果:2. 辅助工具2
- 本文实例为大家分享了Unity实现本地文本多语言化的具体代码,供大家参考,具体内容如下在unity项目过程中大多都会遇到多语言化,下面讲一下
- import java.awt.*; import java.util.*; import javax.swing.*; public cl
- Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应
- 这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。如果你也出现了这种情况,可以从下
- 对于javascript的冒泡,我一直误解它了,冒泡,即是从底层往外blow blow blow ...惭愧的是,我一直以为阻止冒泡是阻止父
- 上周工作中遇到一个奇怪的问题,解决之后想想还是写出来和大家分享一下。故障描述:在A程序中使用Process.Start方法调用一个B.exe
- 前言背景平时开发中遇到根据当前用户的角色,只能查看数据权限范围的数据需求。列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是
- 什么是自动装箱,拆箱先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是
- 本文实例讲述了Java Base64算法实际应用之邮件发送。分享给大家供大家参考,具体如下:一 利用telnet和Base64来实现收发邮件
- 前言最近在网上看到一篇文章,里面说到:List<T>.FindAll的效率竟然比for循环还差,下面是文章的截图:我在上文代码基
- 前言我们大家平时长时间打代码的时候肯定会感到疲惫和乏味,这个时候一边播放自己喜欢的音乐,一边继续打代码,心情自然也愉快很多。音乐带给人的听觉
- 一、什么是Java事务通常的观念认为,事务仅与数据库相关。  
- 前言最近在优化自己之前基于Spring AOP的统一响应体的实现方案。什么是统一响应体呢?在目前的前后端分离架构下,后端主要是一个RESTf
- 前言定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行。但定时器线程池也还是线程池,最底层实现还是ThreadPoolEx
- 0.前言文章需求:对于学生来说,目前网上确实没有比较统一而且质量好的支付教程。因为支付对个人开发者尤其是学生来说不太友好。因此,自己折腾两天
- 引言在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户
- 方案一.使用国内的镜像阿里仓库等首先通过maven的路径找到setting.xml的文件然后在其中修改mirror和profile保存一下就
- 这是一个演示如何使用java执行定时任务的实例,本实例开始运行后不会自动结束,请在运行本实例后手动结束程序。package com.hong
- Java停止线程的逻辑(协同、通知)在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止。但是当我们调用interr