kotlin中的List集合分为可变和不可变,如果对集合中的数据没有增、删、改的需求,那么两种方式都可用。但是如果有增、删、改的需求,就只能声明可变List(MutableList)
我们可以用 listof() 函数创建一个不可变List,它有3个重载函数,创建的List都是不可变的
public inline fun <T> listOf(): List<T> = emptyList()
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
public fun <T> listOf(element: T): List<T> = java.util.Collections.singletonList(element)
我们可以点进listOf() 函数的返回值类型List中查看一下源码
public interface List<out E> : Collection<E> {
override val size: Int
override fun isEmpty(): Boolean
override fun contains(element: @UnsafeVariance E): Boolean
override fun iterator(): Iterator<E>
override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean
public operator fun get(index: Int): E
public fun indexOf(element: @UnsafeVariance E): Int
public fun lastIndexOf(element: @UnsafeVariance E): Int
public fun listIterator(): ListIterator<E>
public fun listIterator(index: Int): ListIterator<E>
public fun subList(fromIndex: Int, toIndex: Int): List<E>
}
从源码中可以看出,不可变List只有查找函数,而没有add(),remove(),clear(),set()等修改集合元素的函数。所以在平时使用List集合的时候,需要根据自己的需求来声明List集合。本人在学kotlin的过程中,就犯了这样的错误,使用listof()函数创建了一个集合,却怎么也找不到add()函数,困惑了好久!
与不可变List相对应的自然就是可变List(MutableList)了。在MutableList中,除了继承List中的那些函数外,另外新增了add/addAll、remove/removeAll/removeAt、set、clear、retainAll等更新修改的操作函数。
创建一个MutableList的对象实例跟List类似,前面加上前缀 mutable
val mutableList = mutableListOf(1, 2, 3)
println(mutableList)
输出:
[1, 2, 3]
另外,我们也可以直接使用Kotlin封装的 arrayListOf 函数来创建一个可变List:
val arrayList= arrayListOf(1, 2, 3)
println(arrayList)
输出:
[1, 2, 3]
虽然,kotlin将List集合分为可变和不可变,但是它们之间也是可以互相转换的
//创建一个不可变List
val imList = listOf(4, 5, 6)
//将不可变List转换为可变List
imList.toMutableList()
//创建一个可变List
val mutableList = mutableListOf(1, 2, 3)
//将一个可变List转换为不可变List
mutableList.toList()