我们可以使用listOf函数来构建一个不可变的List(read-only,只读的List)。它定义在libraries/stdlib/src/kotlin/collections/Collections.kt 里面。关于listOf这个构建函数有下面3个重载函数:
@kotlin.internal.InlineOnly
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()
@JvmVersion
public fun <T> listOf(element: T): List<T> = java.util.Collections.singletonList(element)
这些函数创建的List都是是只读的(readonly,也就是不可变的immutable )、可序列化的。
其中,
listOf()用于创建没有元素的空List
listOf(vararg elements: T)用于创建只有一个元素的List
listOf(element: T)用于创建拥有多个元素的List
我们使用代码示例分别来演示其用法:
首先,我们使用listOf()来构建一个没有元素的空的List:
>>> val list:List<Int> = listOf()
>>> list
[]
>>> list::class
class kotlin.collections.EmptyList
注意,这里的变量的类型不能省略,否则会报错:
>>> val list = listOf()
error: type inference failed: Not enough information to infer parameter T in inline fun <T> listOf(): List<T>
Please specify it explicitly.
val list = listOf()
^
因为这是一个泛型函数。关于泛型,我们将在下一章中介绍。其中,EmptyList 是一个 internal object EmptyList, 这是Kotlin内部定义的一个默认空的object List类。
下面,我们再来创建一个只有1个元素的List:
>>> val list = listOf(1)
>>> list::class
class java.util.Collections$SingletonList
我们可以看出,它实际上是调用Java的java.util.Collections 里面的singletonList方法:
public static <T> List<T> singletonList(T o) {
return new SingletonList<>(o);
}
我们再来创建一个有多个元素的List:
>>> val list = listOf(0,1, 2, 3, 4, 5, 6,7,8,9)
>>> list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list::class
class java.util.Arrays$ArrayList
>>> list::class.java
它调用的是
fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
这个函数。其中,asList函数是Array的扩展函数:
public fun <T> Array<out T>.asList(): List<T> {
return ArraysUtilJVM.asList(this)
}
而这个ArraysUtilJVM是一个Java类,里面实际上调用的是java.util.Arrays和java.util.List :
package kotlin.collections;
import java.util.Arrays;
import java.util.List;
class ArraysUtilJVM {
static <T> List<T> asList(T[] array) {
return Arrays.asList(array);
}
}
另外,我们还可以直接使用arrayListOf函数来创建一个Java中的ArrayList对象实例:
>>> val list = arrayListOf(0,1,2,3)
>>> list
[0, 1, 2, 3]
>>> list::class
class java.util.ArrayList
>>> val list = listOf(0,1, 2, 3, 4, 5, 6,7,8,9)
>>> list::class
class java.util.Arrays$ArrayList
这个函数定义在libraries/stdlib/src/kotlin/collections/Collections.kt类中:
@SinceKotlin("1.1")
@kotlin.internal.InlineOnly在MutableList中,除了继承List中的那些函数外,另外新增了add/addAll、remove/removeAll/removeAt、set、clear、retainAll等更新修改的操作函数。
override fun add(element: E): Boolean
override fun remove(element: E): Boolean
override fun addAll(elements: Collection<E>): Boolean
fun addAll(index: Int, elements: Collection<E>): Boolean
override fun removeAll(elements: Collection<E>): Boolean
override fun retainAll(elements: Collection<E>): Boolean
override fun clear(): Unit
operator fun set(index: Int, element: E): E
fun add(index: Int, element: E): Unit
fun removeAt(index: Int): E
override fun listIterator(): MutableListIterator<E>
override fun listIterator(index: Int): MutableListIterator<E>
override fun subList(fromIndex: Int, toIndex: Int): MutableList<E>
创建一个MutableList的对象实例跟List类似,前面加上前缀mutable,代码示例如下:
>>> val list = mutableListOf(1, 2, 3)
>>> list
[1, 2, 3]
>>> list::class
class java.util.ArrayList
>>> val list2 = mutableListOf<Int>()
>>> list2
[]
>>> list2::class
class java.util.ArrayList
>>> val list3 = mutableListOf(1)
>>> list3
[1]
>>> list3::class
class java.util.ArrayList
我们可以看出,使用mutableListOf函数创建的可变集合类,实际上背后调用的是java.util.ArrayList类的相关方法。
另外,我们可以直接使用Kotlin封装的arrayListOf函数来创建一个ArrayList:
>>> val list4 = arrayListOf(1, 2, 3)
>>> list4::class
class java.util.ArrayList
关于Kotlin中的ArrayList类型别名定义在kotlin/collections/TypeAliases.kt 文件中:
@file:kotlin.jvm.JvmVersion
package kotlin.collections
@SinceKotlin("1.1") public typealias RandomAccess = java.util.RandomAccess
@SinceKotlin("1.1") public typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public typealias HashSet<E> = java.util.HashSet<E>
// also @SinceKotlin("1.1")
internal typealias SortedSet<E> = java.util.SortedSet<E>
internal typealias TreeSet<E> = java.util.TreeSet<E>
如果我们已经有了一个不可变的List,而我们现在想把他转换成可变的List,我们可以直接调用转换函数toMutableList:
val list = mutableListOf(1, 2, 3)
val mlist = list.toMutableList()
mlist.add(5)
public inline fun <T> arrayListOf(): ArrayList<T> = ArrayList()
同样的处理方式,这里的ArrayList()是Java中的java.util.ArrayList的类型别名:
@SinceKotlin("1.1") public typealias ArrayList<E> = java.util.ArrayList<E>