引言:Kotlin中空列表的悖论
\n\n想象一下:你在用Kotlin编写代码,需要创建一个可以动态添加元素的列表。你知道List是不可变集合,而MutableList正是你需要的。但当你写下val list = MutableList()时,编译器却报错了。熟悉吗?
这个问题是Stack Overflow上Kotlin初学者(以及不仅仅是初学者)中最常见的问题之一。成千上万的开发者都在同一个坑里栽跟头:如何正确初始化一个空的MutableList?看似小事,但没有它,任何动态算法都无法运行。
在本文中,我们将介绍在Kotlin中创建空可变列表的所有合法方法。从简单的技巧到高级技术。你将了解为什么mutableListOf()是你最好的朋友,而ArrayList()则是可靠的老伙伴。开始吧!
1. 为什么直接使用MutableList()不行?
\n\n让我们先澄清一个误解。如果你尝试编写:
\n\n// 编译错误!\nval list = MutableList()\n\n编译器会理所当然地报错。为什么?因为MutableList是一个接口,而不是具体的类。接口不能被实例化。这就像试图创建一个没有指定品牌和型号的“汽车”。Kotlin需要具体的实现。
幸运的是,我们有几种优雅的方法可以绕过这个限制。
\n\n2. 最简单的方法:mutableListOf()
\n\n这是空列表之王。来自Kotlin标准库的标准工厂函数:
\n\nval emptyList = mutableListOf<String>()\nprintln(emptyList) // 输出:[]\nprintln(emptyList.size) // 输出:0\n\n为什么这很棒:
\n- \n
- 如果类型可以从上下文中推断出来,则无需指定类型 \n
- 在底层创建一个类型为
ArrayList的MutableList\n - 读起来就像“从无到有创建一个可变列表” \n
添加元素非常轻松:
\n\nval numbers = mutableListOf<Int>()\nnumbers.add(1)\nnumbers.add(2)\nnumbers.add(3)\nprintln(numbers) // [1, 2, 3]\n\n这个方法适用于90%的情况。请把它作为主要方法记住。
\n\n3. 经典方法:ArrayList()——王者归来
\n\n如果你来自Java,这个方法会让你感到亲切。Kotlin完全兼容Java Collections Framework,因此你可以直接使用ArrayList:
val list = ArrayList<String>()\nprintln(list) // []\n\n但有一个细节:ArrayList是MutableList接口的一个具体实现。如果将来你想更改实现(例如改为LinkedList),就必须更改变量的类型。从这个意义上说,mutableListOf()更灵活,因为它返回的是MutableList。
何时使用ArrayList():
\n- \n
- 当需要最大性能时(ArrayList在按索引访问时比LinkedList更快) \n
- 当你使用期望特定ArrayList的Java库时 \n
- 当你特意选择特定实现时 \n
4. 巧妙方法:MutableList(size) { defaultValue }
\n\n有时空列表并不完全是“空”的。有时需要创建一个预先知道大小但包含空值的列表。为此,有一个构造函数重载:
\n\n// 创建一个包含5个元素的列表,每个元素都是空字符串\nval list = MutableList(5) { "" }\nprintln(list) // [, , , , ]\nprintln(list.size) // 5\n\n这并不完全是一个空列表,而是一个用“占位符”初始化的列表。当你确切知道元素数量但会覆盖它们时,这很有用。
\n\n要完全为零,请使用
博客
书籍推荐
推荐阅读