Kotlin:集合(一)

// 文章后面会讲解forEach高阶函数。比for循环简洁多了
for (index in arr){
print(“$index \t”)
}

输出结果:

4    3    2    1

二、集合类型

Kotlin中的集合和其他语言不同的是,Kotlin集合可分为可变和不可变集合。

Kotlin中,集合类型包含三种类型:它们分别是:ListSetMap,他们之间存在以下几个异同点:

  1. 它们都是接口,并不是实际的类。
  2. 它们只实现了isEmpty()、size、contains()等函数以及属性。
  3. ListSet都继承至Collection接口,且Collection继承于Iterable接口。而Map是独立出来的一个接口。这一点和Java相同。
  4. 这三种集合类型分别有存在MutableList、MutableSet、MutableMap接口,这些接口中提供了改变、操作集合的方法。例如add()clear()remove()等函数。

由以上几点我们可出,在定义集合类型变量的时候如果使用List<E>Set<E>Map<K,V>声明的时候该集合则是不可变集合,而使用MutableList<E>MutableSet<E>MutableMap<K,V>的时候该集合才是可变类型集合。这里我就不提供源码来分析了,有兴趣的可以看一看源码!源码在kotlin\collections\Collections.kt文件

2.1、List类型

我们知道,一个接口是不能直接实例化的,那我们要初始化一个怎么做呢?其实Kotlin给我们提供了相应的标准库函数去处理。

  • 声明并初始化List的集合:使用listOf(..)函数
  • 声明并初始化MutableList的集合:使用mutableListOf(..)函数

例1:使用listOf()初始化不可变的List类型集合

val arr = arrayOf(“1”,“2”,3,4,5)   
val list1 = listOf(1,2,“3”,4,“5”)                // 随意创建
val list2 = listOf(“1”,“2”,“3”,“4”,“5”)  // 确定元素的值类型
val list3 = listOf(arr)                          // 可传入一个数组

// 以下代码是错误的。因为List只能是不可变集合。而add、remove、clear等函数是MutableList中的函数
// list1.add()
// list1.remove

// 遍历
for(value in list1){
print(“$value \t”)
}

输出结果:

1    2    3    4    5

例2:使用mutableListOf()初始化可变的List类型集合

val arr = arrayOf(“1”,2,3,4)
val mutableList1 = mutableListOf(1,2,“3”,4,“5”)                // 随意创建
val mutableList2 = mutableListOf(“1”,“2”,“3”,“4”,“5”)  // 确定元素的值类型
val mutableList3 = mutableListOf(arr)                          // 可传入一个数组
val mutableList : ArrayList  // 这里的ArrayList<>和Java里面的ArrayList一致

mutableList1.add(“6”)  // 添加元素
mutableList1.add(“7”)
mutableList1.remove(1)   // 删除某一元素

// 遍历
for(value in mutableList1){
print(“$value \t”)
}

mutableList1.clear()   // 清空集合

输出结果为:

2    3    4    5    6    7

2.2、Set类型

Set类型集合的使用和List类型集合大致相同。这里不做详细的介绍,只讲解它和List类型集合不同的地方。

  • 声明并初始化Set的集合:使用setOf(..)函数
  • 声明并初始化MutableSet的集合:使用mutableSetOf(..)函数

例1: 声明并初始化

val set1 = setOf(1,2,“3”,“4”,“2”,1,2,3,4,5)
val mutableSet1 = mutableSetOf(1,2,“3”,“4”,“2”,1,2,3,4,5)
val mutableSet2 : HashSet  // 这里的HashSet<>和Java里面的HashSet<>一致

例2 :遍历集合,看效果与预计的有什么不同

// 遍历
for(value in set1){
print(“$value \t”)
}

输出结果:

1    2    3    4    2    3    4    5

在我们预计的效果中,遍历的结果应该为:1 2 3 4 2 1 2 3 4 5,但是结果却少了一个1 2。那么我们可以看出,Set类型集合会把重复的元素去除掉。这一点和Java是不谋而合的。这个特性也是Set类型集合与List集合类型的区别所在。

2.3、Map类型

Map<K,V>类型集合和List以及Set都有着差别。下面我们看Map类型集合的声明及初始化。

同前面两种类型一样,Map同样也分为不可变与可变集合。其中:

  • 不可变的Map类型集合的初始化使用:mapOf()函数
  • 可变的Map类型集合的初始化使用:mutableMapOf()函数

不过初始化和前面两种类型有差别,Map集合类型是一种以键-值对的方式出现。例:

// 以键值对的形式出现,键与值之间使用to
val map1 = mapOf(“key1” to 2 , “key2” to 3)
val map2 = mapOf<Int,String>(1 to “value1” , 2 to “value2”)
val mutableMap = mutableMapOf(“key1” to 2 , “key1” to 3)
val hashMap = hashMapOf(“key1” to 2 , “key1” to 3)   // 同Java中的HashMap

map2.forEach{
key,value -> println(“KaTeX parse error: Undefined control sequence: \t at position 5: key \̲t̲ value”)
}

输出结果为:

1      value1
2      value2

PS:当我们的键存在重复时,集合会过滤掉之前重复的元素

例:

val map = val map1 = mapOf(“key1” to 2 , “key1” to 3 , “key1” to “value1” , “key2” to “value2”)

map.forEach{
key,value -> println(“KaTeX parse error: Undefined control sequence: \t at position 5: key \̲t̲ value”)
}

输出结果为:

key1      value1
key2      value2

从上面的例子可以看出,当key值为key1时,元素只保留了最后一个元素。而过滤掉了之前key值相同的所有元素。

三、 集合类型的协变

试想一下,当一个集合赋值给另外一个集合时,这里以List<E>举例,如果两个集合的类型也就是E类型相同时,赋值是没有问题的。如果类型不同的情况,当E继承自M时。你就可以把List<E>赋值给List<M>了。这种情况称之为_协变_

例1 :

open class Person(val name : String , val age : Int){
override fun toString(): String {
return “Person(name=' n a m e ′ ,   a g e = name', age= name, age=age)”
}
}

class Student(name: String, age : Int, cls : String) : Person(name, age)

// 注意:Any是kotlin中的超类,故而Student类也是继承自Any的。这里你可以换成Person类结果是相同的
var listPerson: List
val listStudent : List = listOf(Student(“张三”,12,“一班”),Student(“王五”,20,“二班”))
listPerson = listStudent

listPerson.forEach { println(it.toString()) }

输出结果:

Person(name=‘张三’, age=12)
Person(name=‘王五’, age=20)

例2 : 当集合的类型相同或有继承关系时,一个集合使用MutableList,一个集合使用List的情况。

var mutableListPerson: MutableList
val mutableListStudent : List = listOf(Student(“张三”,12,“一班”),Student(“王五”,20,“二班”))
mutableListPerson = mutableListStudent.toMutableList()

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值