返回顶部
首页 > 资讯 > 移动开发 >Kotlin数据容器深入讲解
  • 160
分享到

Kotlin数据容器深入讲解

2024-04-02 19:04:59 160人浏览 泡泡鱼
摘要

目录前言一、Kotlin数组1、Kotlin数组创建技巧2、原生类型数组3、数组常见的操作二、Kotlin集合1、集合创建的技巧2、集合的操作前言 容器是用于存放数据的载体。容器分为

前言

容器是用于存放数据的载体。容器分为数组、集合。 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,让我们一起来学习一下:

到此这篇关于Kotlin数据容器深入讲解的文章就介绍到这了,更多相关Kotlin数据容器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Kotlin数据容器深入讲解

本文链接: https://lsjlt.com/news/167451.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Kotlin数据容器深入讲解
    目录前言一、Kotlin数组1、Kotlin数组创建技巧2、原生类型数组3、数组常见的操作二、Kotlin集合1、集合创建的技巧2、集合的操作前言 容器是用于存放数据的载体。容器分为...
    99+
    2024-04-02
  • R语言的数据输入深入讲解
    既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来探讨一下。 首先,数据...
    99+
    2024-04-02
  • vue单向数据流的深入讲解
    目录vue单向数据流代码示例特殊情况注意点:总结vue单向数据流 在vue中需要遵循单向数据流原则 在父传子的前提下,父组件的数据发生会通知子组件自动更新子组件内部,不能直接修改父组...
    99+
    2024-04-02
  • Vue深入讲解数据响应式原理
    目录响应式是什么如何实现数据响应式实现对象属性拦截通用的劫持方案总结响应式是什么 简而言之就是数据变页面变 如何实现数据响应式 在Javascript里实现数据响应式一般有俩种方案,...
    99+
    2024-04-02
  • C++深入讲解函数重载
    目录函数重载概念重载依据值型别判断函数重载的规则名字粉碎-名字修饰函数重载 概念 在C++中可以为两个或者两个以上函数提供相同的函数名称,只要参数类型不同,或者参数数目不同,参数顺序...
    99+
    2024-04-02
  • Pythonlambda匿名函数深入讲解
    目录一,Python中lambda函数的语法二,两个注意点三,lambda 应用一,Python中lambda函数的语法 lambda 函数在 Python 编程语言中使用频率非常高...
    99+
    2023-01-28
    Python lambda匿名函数 Python lambda Python匿名函数
  • java数据类型和运算符的深入讲解
    一.整型变量 1.基本格式 int 变量名 = 初始值; 代码示例: public class CSDN { public static void main(String[]...
    99+
    2024-04-02
  • R语言数据类型和对象深入讲解
    以上数据类型均为原子向量。 单引号和双引号不做区分。 R语言中TRUE和FALSE 可以简化为T和F 多元素向量的生成方式 方式 1:使用c()函数 ,这个是最常见的 c(co...
    99+
    2024-04-02
  • python中pandas.read_csv()函数的深入讲解
    这里将更新最新的最全面的read_csv()函数功能以及参数介绍,参考资料来源于官网。 pandas库简介 官方网站里详细说明了pandas库的安装以及使用方法,在这里获取最新的p...
    99+
    2024-04-02
  • R语言boxplot函数深入讲解
    箱线图简介 箱线图又称箱形图或盒须图,该图是由5个特征值绘制而成的图形。 5个特征值是变量的最大值、最小值、中位数、第1四分位数和第3四分位数。 连接两个分位数画出一个箱子,箱子用中...
    99+
    2024-04-02
  • 深入讲解Socket原理
    目录关于TCP/IP、UDP、Socket什么是TCP/IP、UDP?Socket在哪里呢?Socket是什么呢?你会使用它们吗?1、网络中进程之间如何通信?2、什么是Socket?...
    99+
    2024-04-02
  • ECMAScript中迭代器的深入讲解
    目录前言较早的迭代 迭代器模式 迭代器工厂函数 迭代器协议 写在最后 前言 许多初级前端开发者在往中级迈进的过程中,面试经常问到的一个就是迭代器和生成器,其实在开发中都用过,但是并不...
    99+
    2024-04-02
  • C++深入浅出讲解函数重载
    目录前言函数重载1.1 函数重载的概念1.2 函数重载的意义1.3 名字修饰(name Mangling)1.4 extern "C"前言 自然语言中,一个词可以...
    99+
    2024-04-02
  • C++深入浅出讲解缺省参数
    目录缺省参数定义用法缺省参数 一般情况下,函数调用时的实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。 定...
    99+
    2024-04-02
  • JavaWeb中Servlet的深入讲解
    Servlet 1 Servlet 简介 Servlet就是Sun 公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet ,如果你向开发一个Serv...
    99+
    2024-04-02
  • 深入讲解Java Maven配置
    目录首先说明maven配置都是那些配置1. pom.xml 配置2. maven 的settings.xmla. mirrorsb. serversc. profiles总结由于ma...
    99+
    2024-04-02
  • 深入讲解SpringBootActuator是什么
    目录Actuator是什么快速开始Spring Boot Actuator 1.x端点配置端点/health端点获取详细的health信息自定义health的信息/info端点/me...
    99+
    2023-01-16
    SpringBoot Actuator SpringBoot Actuator的作用
  • AndroidViewModel的作用深入讲解
    ViewModel它的作用是什么呢 ViewModel 类旨在以注重生命周期的方式存储和管理界面相关数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存(官方解释)...
    99+
    2023-05-20
    Android ViewModel Android ViewModel作用
  • Python上下文管理器深入讲解
    目录引子概念上下文管理协议(Context Management Protocol)上下文管理器(Context Manager)引子 上下文管理器是一种简化代码的有力方式,其内部也...
    99+
    2022-12-21
    Python上下文管理器 Python上下文
  • C语言深入讲解函数的使用
    目录关于函数1. 函数的定义形式2. 函数的声明3. 返回语句4. 函数参数4.1 形式参数(传值调用)4.2 实际参数(传址调用)4.3 无参数5. 函数的调用5.1 嵌套调用5....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作