Kotlin:List vs Array — 你需要了解的数据类型之战

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

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

开始课程

Kotlin:List vs Array — 玄机何在?

\n\n

如果你用Kotlin编程至少一周,你肯定遇到过这个问题:“为什么我不能到处都用Array?我要这些List和MutableList干嘛?”

\n\n

这个问题是Stack Overflow上最热门的问题之一。这并非偶然。乍一看,列表和数组都存储元素,都可以通过索引访问,都可以遍历。但深入挖掘后,你会发现它们存在根本性的差异,这些差异会影响性能、代码安全性,甚至影响你设计架构时的思维方式。

\n\n

在本教程中,我们将详细剖析Kotlin中List和Array的区别。你将了解何时使用数组,何时使用列表,以及为什么经验丰富的开发者几乎总是选择List。

\n\n

1. 基础:Kotlin中的Array是什么?

\n\n

Kotlin中的Array是Java数组的直接映射。它是一个固定长度的、同一类型元素的序列。创建数组时,会立即为其分配内存。创建后无法更改数组的大小。

\n\n
// 创建数组\nval numbers: Array<Int> = arrayOf(1, 2, 3, 4, 5)\nprintln(numbers[0]) // 1\nnumbers[2] = 10     // 可以修改值\nprintln(numbers[2]) // 10
\n\n

Kotlin中的数组本质上是mutable(可变的):你始终可以按索引替换元素。但你不能添加新元素或删除现有元素。大小是永久固定的。

\n\n

Array的特点:

\n
    \n
  • 固定大小 — 不能添加或删除元素。
  • \n
  • 内容可变 — 可以覆盖元素。
  • \n
  • 性能 — 最高,因为直接访问内存。
  • \n
  • 基本类型数组 — 有特殊类型:IntArray、ByteArray、FloatArray等。它们无需装箱操作,从而提升速度。
  • \n
\n\n
// 基本类型数组 — 无装箱\nval intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)
\n\n

2. 基础:Kotlin中的List是什么?

\n\n

List是Kotlin标准库中的一个接口。与数组不同,列表是一种抽象。你不知道它内部如何存储数据(可能是ArrayList、LinkedList或其他)。

\n\n
// 创建不可变列表\nval fruits: List<String> = listOf("apple", "banana", "cherry")\nprintln(fruits[0]) // apple\n// fruits[0] = "orange" // 编译错误!
\n\n

Kotlin的主要“特色”是区分只读(List)和可变(MutableList)。

\n\n

List(只读):

\n
    \n
  • 不能修改内容(不能添加、删除或替换)。
  • \n
  • 只能读取。
  • \n
  • 在组件之间传递数据时更安全。
  • \n
\n\n

MutableList:

\n
    \n
  • 可以添加、删除、替换元素。
  • \n
  • 动态大小。
  • \n
  • 实践中,底层通常使用ArrayList。
  • \n
\n\n
val mutableFruits: MutableList<String> = mutableListOf("apple", "banana")\nmutableFruits.add("orange")     // OK\nmutableFruits.remove("banana")  // OK\nmutableFruits[0] = "pear"       // OK
\n\n

3. List vs Array的关键区别

\n\n

让我们用一张清晰的表格来总结(以代码注释的形式)。

\n\n
// 1. 可变性\nval array = arrayOf(1, 2, 3)\narray[0] = 99 // ✅ 可行\n\nval list = listOf(1, 2, 3)\n// list[0] = 99 // ❌ 编译错误\n\nval mutableList = mutableListOf(1, 2, 3)\nmutableList[0] = 99 // ✅ 可行\n\n// 2. 大小\nval fixedArray = arrayOf(1, 2, 3)\n// fixedArray.add(4) // ❌ 没有这个方法\n\nva                

博客

书籍推荐