IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin学习——集合(一) -> 正文阅读

[移动开发]Kotlin学习——集合(一)

集合概述

集合通常包含相同类型的一些(数目也可以为零)对象。集合中的对象称为元素或者条目。下面是 Kotlin 相关的集合类型:

  • List 是一个有序集合,可以通过索引访问元素。元素可以在 list 中出现多次。列表的一个示例是一句话:有一组字、这些字的顺序很重要并且字可以重复
  • Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字母的集合(set)
  • Map 是一组键值对。键是唯一的,每个键刚好映射到一个值。值可以重复。map 对于存储对象之间的逻辑链接非常有用

集合类型

Kotlin 标准库提供了基本集合类型的实现:set、list以及map。一对接口代表每种集合类型:

  • 一个只读接口,通过访问集合元素的操作
  • 一个可变接口,通过写操作扩展相应的只读接口:添加、删除和更新其元素

更改可变集合不需要它是以 var 定义的变量:写操作修改同一个可变集合对象,因此引用不会改变。也就是说虽然定义的是val类型的不可变的集合,我们可以改变集合里面的数据,但是我们的集合对象是没有改变的,所以对于val类型的集合也是可以改变其集合内部值的。但是,如果尝试对 val 集合重新赋值,那么将会收到编译错误。

只读集合类型是型变的。集合类型与元素类型具有相同的子类型关系(也就是说可以用子类去替换父类)。map在值(value)类型上是型变的,但是键(key)类型上不是

反之,可变集合不是型变的;否则将导致运行时故障。

Collection

collection 是 set 和 list 的父类。Collection<T> 是集合层次结构的根。此接口表示一个只读集合的共同行为:检索大小、检测是有为成员等等。Collection 继承自 Iterable<T> 接口,它定义了迭代元素的操作。

MutableCollection 是一个具有写操作的 Collection 接口,例如 add 以及 remove

List

List<T> 以制定的顺序存储元素,并提供使用索引访问元素的方法。索引从 0 开始。List 元素(包括空值)可以重复:List 可以包含任意数量的相同对象或单个对象的出现。如果两个 List 在相同的位置具有相同的大小和相同的结构的元素,则认为他们是相等的

MutableList 是可以进行写操作的 List,例如用于在特定位置添加或删除元素

List 与数组(Array)的区别:数组的大小是在初始化时定义的,永远不会改变;但是,List没有预定的大小,作为写操作的结果,可以更改 List 的大小:添加,更新或删除元素

List 的默认实现是 ArrayList,可以将其视为可调整大小的数组

Set

set<T> 存储唯一的元素;它们的顺序通常是未定义的。null 元素也是唯一的:一个 Set 只能包含一个 null。当两个 set 具有相同的大小并且对于一个 set 中的每个元素都能在另一个 set 中存在相同元素,则两个 set 相等

MutableSet 是一个带有来自 MutableCollection 的写操作接口的 Set。

Set 的默认实现 LinkedHashSet——保留元素插入的顺序

Map

Map<K, V> 不是 Collection 接口的继承者,但也是一种集合类型。Map 存储 键-值 对,键是唯一的,但是不同的键可以与相同的值配对。Map 接口提供特定的函数进行通过键访问值、搜索键和值等操作。无论键值对的顺序如何,包含相同键值对的两个 Map 是相等的

MutableMap 是一个具有写操作的 Map 接口,可以使用该接口添加一个新的键值对或更新给定键的值

Map 的默认实现 LinkedHashMap —— 迭代Map时保留元素插入的顺序;HashMap —— 不声明元素的顺序

构造集合

由元素构造

创建集合的最常用方法是使用标准库函数 listOf<T>()、setOf<T>()、mutableListOf<T>()、mutableSetOf<T>()。如果以逗号分隔的集合元素列表作为参数,编译器会自动检测元素类型。创建空集合时,需明确指定类型

val numbersSet = setOf("one","two","three")
val emptySet = mutableSetOf<String>()


//同样 Map 也有同样的函数 mapOf() 与 mutableMapOf()
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3)

//使用 to 符号创建了一个短时存活的 Pair 对象,因此仅性能不重要时才使用它
//为避免过多的内存使用,可以创建可写 Map 并使用写入操作填充它
// apply() 函数可以帮助保持初始化流畅
val numberMap2 = mutableMapOf<String, String>().apply{ this["one"] = "1"; 
this["two"] = "2" }

空集合

用于创建没有任何元素的集合的函数:emptyList()、emptySet() 和 emptyMap();创建空集合时,应指定集合将包含的元素类型

val empty = emptyList<String>()

调用其他集合的函数

可以通过其他集合各种操作的结果来创建集合。

//过滤列表会创建与过滤器匹配的新元素列表
val numbers = listOf("one", "two", "three", "four")
val longerThan3 = numbers.filter{ it.length > 3}


//映射生成转换结果列表
val numbers = setOf(1, 2, 3)
println(numbers.map{ it * 3})
println(numbers.mapIndexed{ idx, value -> value * idx })

//关联生成 Map
println(numbers.associateWith{ it.length })

迭代器

Kotlin 标准库支持迭代器的常用机制——对象可按顺序提供对其元素的访问权限,而不会暴露集合的底层结构。当需要逐个处理集合的所有元素时,迭代器非常有用。

Iterable<T> 接口的继承者可以通过调用 iterator() 函数获得迭代器。一旦获得迭代器它就指向集合的第一个元素;调用 next() 函数将返回此元素,并将迭代器指向下一个元素(如果下一个元素存在)。一旦迭代器通过了最后一个元素,它就不能用于检索元素;也无法重新指向到以前的任何位置。要再次遍历集合,需创建一个新的迭代器

val numbers = listOf("one", "two", "three")
val numbersIterator = numbers.iterator()
while(numbersIterator.hsaNext()){
    println(numberIterator.next())
}

List 迭代器

对于列表,有一个特殊的迭代器实现:ListIterator 它支持列表双向迭代:正向与反向。反向迭代由 hasPrevious() 和 previous() 函数实现。此外,ListIterator 通过 nextIndex() 与 previousIndex() 函数提供有关元素索引的信息

val numbers = listOf("one", "two", "three")
val listIterator = numbers.listIterator()
while(listIterator.hasNext()) listIterator.next()
wihle(listIterator.hasPrevious()) listIterator.previous()

具有双向迭代的能力意味着 listIterator 在到达最后一个元素后仍可以使用

可变迭代器

为了迭代可变集合,MutableIterator 来扩展 Iterator 使其具有元素删除函数 remove()

MutableListIterator 可以在迭代列表时插入和替换元素

val numbers = mutableListOf("one", "two", "three", "four")
val numberIterator = numbers.iterator()
numberIterator.next()

numberIterator.remove()
println("After removal: $numbers")

val numbers2 = mutableListOf("one","four","four")
val number2ListIterator = numbers2.listIterator()
number2ListIterator.next()
number2ListIterator.add("two")
number2ListIterator.next()
number2ListIterator.add("three")
println(numbers2)
    
//After removal: [two, three, four]
//[one, two, four, three, four]

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:07:14  更:2022-01-12 00:09:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:10:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码