// 文章后面会讲解forEach高阶函数。比for循环简洁多了
for (index in arr){
print(“$index \t”)
}
输出结果:
4 3 2 1
二、集合类型
Kotlin
中的集合和其他语言不同的是,Kotlin
集合可分为可变和不可变集合。
在
Kotlin
中,集合类型包含三种类型:它们分别是:List
、Set
、Map
,他们之间存在以下几个异同点:
- 它们都是接口,并不是实际的类。
- 它们只实现了
isEmpty()、size、contains()
等函数以及属性。List
和Set
都继承至Collection
接口,且Collection
继承于Iterable
接口。而Map
是独立出来的一个接口。这一点和Java
相同。- 这三种集合类型分别有存在
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()
文末
架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。
一线互联网Android面试题总结含详解(初级到高级专题)
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
33)]
[外链图片转存中…(img-fK9DBvg2-1715578455036)]
一线互联网Android面试题总结含详解(初级到高级专题)
[外链图片转存中…(img-YfEgwgcy-1715578455037)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!