1. 概述

在 Kotlin 开发中,List 是一个非常常用的数据结构。本文将介绍如何在 Kotlin 中向 List 添加元素,并结合不同类型的列表类型(ArrayListMutableListList)进行说明。

对于从 Java 转过来的开发者来说,Kotlin 的集合类型可能有些困惑。Kotlin 不仅支持 ArrayList,还引入了如 ListMutableList 这样的新类型。在使用过程中,你会发现并不是所有 List 都支持 add() 方法。

我们将通过代码示例来展示如何正确地向不同类型的 List 添加元素,并解释背后的原理。


2. Kotlin 中的 List 类型

Kotlin 中常见的三种 List 类型如下:

类型 可变性 说明
ArrayList 可变 类似 Java 的 ArrayList,支持添加、删除等操作
MutableList 可变 通过 mutableListOf() 初始化,底层也是 ArrayList 实例
List 只读 不支持添加或删除元素,但可以通过重新赋值生成新列表

理解这三者之间的区别是正确操作列表的关键。


3. 向 ArrayList 添加元素

ArrayList 的使用方式与 Java 几乎一致,可以直接调用 add() 方法添加元素:

val myArrayList = ArrayList<String>()
myArrayList.add("Tom Hanks")
assertThat(myArrayList).containsExactly("Tom Hanks")

此外,Kotlin 支持运算符重载,可以使用 += 操作符来添加元素,使代码更简洁:

myArrayList += "Brad Pitt"
assertThat(myArrayList).containsExactly("Tom Hanks", "Brad Pitt")

推荐使用 += 来增强代码可读性


4. 向 MutableList 添加元素

MutableList 通常通过 mutableListOf() 初始化,其底层实现是 ArrayList,因此支持 add()+=

val myMutable = mutableListOf("Tom Hanks", "Brad Pitt")
myMutable.add("Tom Cruise")
assertThat(myMutable).containsExactly("Tom Hanks", "Brad Pitt", "Tom Cruise")

myMutable += "Will Smith"
assertThat(myMutable).containsExactly("Tom Hanks", "Brad Pitt", "Tom Cruise", "Will Smith")

⚠️ 注意:MutableList 必须使用 var 声明,否则 += 操作会报错


5. 向只读 List 添加元素

List 是只读的,不支持直接添加元素。尝试调用 add() 会编译失败:

val myList = listOf("Tom Hanks", "Brad Pitt")
myList.add("Tom Cruise") // ❌ 编译错误:Unresolved reference: add

使用 += 操作符也不会成功,但错误信息不同:

myList += "Tom Cruise" // ❌ 编译错误:Val cannot be reassigned

这是因为 List+ 操作符会创建一个新列表,而不是修改原列表:

public operator fun <T> Collection<T>.plus(element: T): List<T> {
    val result = ArrayList<T>(size + 1)
    result.addAll(this)
    result.add(element)
    return result
}

正确做法:使用 var 声明变量,并通过 += 生成新对象

var myList = listOf("Tom Hanks", "Brad Pitt")
val originalList = myList

myList += "Tom Cruise"
assertThat(myList).containsExactly("Tom Hanks", "Brad Pitt", "Tom Cruise")
assertThat(myList).isNotSameAs(originalList) // 新对象

6. 小结

  • ArrayListMutableList 支持 add()+= 操作。
  • List 是只读的,不支持直接修改。
  • ⚠️ 使用 += 时注意是否为 var 声明的变量。
  • List+ 操作会返回新列表,原列表不变。

7. 示例源码

完整示例源码可在 GitHub 上查看。

如果你在实际项目中遇到类似“为什么 List 不能 add”的问题,希望这篇文章能帮你理清思路,避免踩坑。


原始标题:Add an Element to a List in Kotlin