1. 概述
在 Kotlin 开发中,List
是一个非常常用的数据结构。本文将介绍如何在 Kotlin 中向 List
添加元素,并结合不同类型的列表类型(ArrayList
、MutableList
和 List
)进行说明。
对于从 Java 转过来的开发者来说,Kotlin 的集合类型可能有些困惑。Kotlin 不仅支持 ArrayList
,还引入了如 List
和 MutableList
这样的新类型。在使用过程中,你会发现并不是所有 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. 小结
- ✅
ArrayList
和MutableList
支持add()
和+=
操作。 - ❌
List
是只读的,不支持直接修改。 - ⚠️ 使用
+=
时注意是否为var
声明的变量。 - ✅
List
的+
操作会返回新列表,原列表不变。
7. 示例源码
完整示例源码可在 GitHub 上查看。
如果你在实际项目中遇到类似“为什么 List
不能 add
”的问题,希望这篇文章能帮你理清思路,避免踩坑。