Kotlin:List vs Array — 玄机何在?
\n\n如果你用Kotlin编程至少一周,你肯定遇到过这个问题:“为什么我不能到处都用Array?我要这些List和MutableList干嘛?”
这个问题是Stack Overflow上最热门的问题之一。这并非偶然。乍一看,列表和数组都存储元素,都可以通过索引访问,都可以遍历。但深入挖掘后,你会发现它们存在根本性的差异,这些差异会影响性能、代码安全性,甚至影响你设计架构时的思维方式。
\n\n在本教程中,我们将详细剖析Kotlin中List和Array的区别。你将了解何时使用数组,何时使用列表,以及为什么经验丰富的开发者几乎总是选择List。
1. 基础:Kotlin中的Array是什么?
\n\nKotlin中的Array是Java数组的直接映射。它是一个固定长度的、同一类型元素的序列。创建数组时,会立即为其分配内存。创建后无法更改数组的大小。
// 创建数组\nval numbers: Array<Int> = arrayOf(1, 2, 3, 4, 5)\nprintln(numbers[0]) // 1\nnumbers[2] = 10 // 可以修改值\nprintln(numbers[2]) // 10\n\nKotlin中的数组本质上是mutable(可变的):你始终可以按索引替换元素。但你不能添加新元素或删除现有元素。大小是永久固定的。
\n\nArray的特点:
\n- \n
- 固定大小 — 不能添加或删除元素。 \n
- 内容可变 — 可以覆盖元素。 \n
- 性能 — 最高,因为直接访问内存。 \n
- 基本类型数组 — 有特殊类型:
IntArray、ByteArray、FloatArray等。它们无需装箱操作,从而提升速度。 \n
// 基本类型数组 — 无装箱\nval intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)\n\n2. 基础:Kotlin中的List是什么?
\n\nList是Kotlin标准库中的一个接口。与数组不同,列表是一种抽象。你不知道它内部如何存储数据(可能是ArrayList、LinkedList或其他)。
// 创建不可变列表\nval fruits: List<String> = listOf("apple", "banana", "cherry")\nprintln(fruits[0]) // apple\n// fruits[0] = "orange" // 编译错误!\n\nKotlin的主要“特色”是区分只读(List)和可变(MutableList)。
List(只读):
\n- \n
- 不能修改内容(不能添加、删除或替换)。 \n
- 只能读取。 \n
- 在组件之间传递数据时更安全。 \n
MutableList:
\n- \n
- 可以添加、删除、替换元素。 \n
- 动态大小。 \n
- 实践中,底层通常使用
ArrayList。 \n
val mutableFruits: MutableList<String> = mutableListOf("apple", "banana")\nmutableFruits.add("orange") // OK\nmutableFruits.remove("banana") // OK\nmutableFruits[0] = "pear" // OK\n\n3. 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