Kotlin MutableList:如何创建空列表而不抓狂

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:Kotlin中空列表的悖论

\n\n

想象一下:你在用Kotlin编写代码,需要创建一个可以动态添加元素的列表。你知道List是不可变集合,而MutableList正是你需要的。但当你写下val list = MutableList()时,编译器却报错了。熟悉吗?

\n\n

这个问题是Stack Overflow上Kotlin初学者(以及不仅仅是初学者)中最常见的问题之一。成千上万的开发者都在同一个坑里栽跟头:如何正确初始化一个空的MutableList?看似小事,但没有它,任何动态算法都无法运行。

\n\n

在本文中,我们将介绍在Kotlin中创建空可变列表的所有合法方法。从简单的技巧到高级技术。你将了解为什么mutableListOf()是你最好的朋友,而ArrayList()则是可靠的老伙伴。开始吧!

\n\n

1. 为什么直接使用MutableList()不行?

\n\n

让我们先澄清一个误解。如果你尝试编写:

\n\n
// 编译错误!\nval list = MutableList()
\n\n

编译器会理所当然地报错。为什么?因为MutableList是一个接口,而不是具体的类。接口不能被实例化。这就像试图创建一个没有指定品牌和型号的“汽车”。Kotlin需要具体的实现。

\n\n

幸运的是,我们有几种优雅的方法可以绕过这个限制。

\n\n

2. 最简单的方法:mutableListOf()

\n\n

这是空列表之王。来自Kotlin标准库的标准工厂函数:

\n\n
val emptyList = mutableListOf<String>()\nprintln(emptyList) // 输出:[]\nprintln(emptyList.size) // 输出:0
\n\n

为什么这很棒:

\n
    \n
  • 如果类型可以从上下文中推断出来,则无需指定类型
  • \n
  • 在底层创建一个类型为ArrayList的MutableList
  • \n
  • 读起来就像“从无到有创建一个可变列表”
  • \n
\n\n

添加元素非常轻松:

\n\n
val numbers = mutableListOf<Int>()\nnumbers.add(1)\nnumbers.add(2)\nnumbers.add(3)\nprintln(numbers) // [1, 2, 3]
\n\n

这个方法适用于90%的情况。请把它作为主要方法记住。

\n\n

3. 经典方法:ArrayList()——王者归来

\n\n

如果你来自Java,这个方法会让你感到亲切。Kotlin完全兼容Java Collections Framework,因此你可以直接使用ArrayList:

\n\n
val list = ArrayList<String>()\nprintln(list) // []
\n\n

但有一个细节:ArrayList是MutableList接口的一个具体实现。如果将来你想更改实现(例如改为LinkedList),就必须更改变量的类型。从这个意义上说,mutableListOf()更灵活,因为它返回的是MutableList。

\n\n

何时使用ArrayList():

\n
    \n
  • 当需要最大性能时(ArrayList在按索引访问时比LinkedList更快)
  • \n
  • 当你使用期望特定ArrayList的Java库时
  • \n
  • 当你特意选择特定实现时
  • \n
\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

要完全为零,请使用

博客

书籍推荐