5.3.1 创建不可变List

我们可以使用listOf函数来构建一个不可变的List(read-only,只读的List)。它定义在libraries/stdlib/src/kotlin/collections/Collections.kt 里面。关于listOf这个构建函数有下面3个重载函数:

  1. @kotlin.internal.InlineOnly
  2. public inline fun <T> listOf(): List<T> = emptyList()
  3. public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
  4. @JvmVersion
  5. 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:

  1. >>> val list:List<Int> = listOf()
  2. >>> list
  3. []
  4. >>> list::class
  5. class kotlin.collections.EmptyList

注意,这里的变量的类型不能省略,否则会报错:

  1. >>> val list = listOf()
  2. error: type inference failed: Not enough information to infer parameter T in inline fun <T> listOf(): List<T>
  3. Please specify it explicitly.
  4. val list = listOf()
  5. ^

因为这是一个泛型函数。关于泛型,我们将在下一章中介绍。

其中,EmptyList 是一个 internal object EmptyList, 这是Kotlin内部定义的一个默认空的object List类。

下面,我们再来创建一个只有1个元素的List:

  1. >>> val list = listOf(1)
  2. >>> list::class
  3. class java.util.Collections$SingletonList

我们可以看出,它实际上是调用Java的java.util.Collections 里面的singletonList方法:

  1. public static <T> List<T> singletonList(T o) {
  2. return new SingletonList<>(o);
  3. }

我们再来创建一个有多个元素的List:

  1. >>> val list = listOf(0,1, 2, 3, 4, 5, 6,7,8,9)
  2. >>> list
  3. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  4. >>> list::class
  5. class java.util.Arrays$ArrayList
  6. >>> list::class.java

它调用的是

  1. fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

这个函数。其中,asList函数是Array的扩展函数:

  1. public fun <T> Array<out T>.asList(): List<T> {
  2. return ArraysUtilJVM.asList(this)
  3. }

而这个ArraysUtilJVM是一个Java类,里面实际上调用的是java.util.Arraysjava.util.List :

  1. package kotlin.collections;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. class ArraysUtilJVM {
  5. static <T> List<T> asList(T[] array) {
  6. return Arrays.asList(array);
  7. }
  8. }

另外,我们还可以直接使用arrayListOf函数来创建一个Java中的ArrayList对象实例:

  1. >>> val list = arrayListOf(0,1,2,3)
  2. >>> list
  3. [0, 1, 2, 3]
  4. >>> list::class
  5. class java.util.ArrayList
  6. >>> val list = listOf(0,1, 2, 3, 4, 5, 6,7,8,9)
  7. >>> list::class
  8. class java.util.Arrays$ArrayList

这个函数定义在libraries/stdlib/src/kotlin/collections/Collections.kt类中:

  1. @SinceKotlin("1.1")
  2. @kotlin.internal.InlineOnly
  3. public inline fun <T> arrayListOf(): ArrayList<T> = ArrayList()

同样的处理方式,这里的ArrayList()是Java中的java.util.ArrayList的类型别名:

  1. @SinceKotlin("1.1") public typealias ArrayList<E> = java.util.ArrayList<E>