Kotlin 中ArrayList、listOf、arrayListOf 和 mutableListOf区别

在 Kotlin 中,ArrayListlistOfarrayListOfmutableListOf 是常用的集合创建方式,但它们在类型、可变性和使用场景上有明显区别。以下是核心对比:

一、基本定义与类型

创建方式 类型 可变性 底层实现
ArrayList<T>() ArrayList<T> 可变 Java 的 ArrayList
listOf() List<T>(只读接口) 不可变 Kotlin 内部实现
arrayListOf() ArrayList<T> 可变 Java 的 ArrayList
mutableListOf() MutableList<T>(可变接口) 可变 默认 ArrayList

二、具体区别与示例

1. ArrayList<T>()
  • 本质 :直接创建 Java 的 ArrayList 类实例。

  • 特点:需显式指定类型(除非通过初始化值推断)。

  • 示例

    Kotlin 复制代码
    val list = ArrayList<String>()  // 创建空的可变列表
    list.add("apple")
    list.add("banana")
2. listOf()
  • 本质 :创建不可变的只读列表(实现 List 接口)。

  • 特点

    • 由 Kotlin 标准库提供,优化了空列表和单元素列表的内存占用。
    • 调用 add()remove() 等修改方法会抛出 UnsupportedOperationException
  • 示例

    Kotlin 复制代码
    val immutableList = listOf("a", "b", "c")  // 不可变列表
    // immutableList.add("d")  // 编译错误:List 接口无 add() 方法
3. arrayListOf()
  • 本质 :创建可变的 ArrayList 实例,是 ArrayList() 的快捷方式。

  • 特点

    • 无需显式指定泛型类型(通过初始化值推断)。
    • 完全等价于 ArrayList<T>().apply { addAll(...) }
  • 示例

    Kotlin 复制代码
    val mutableList = arrayListOf("apple", "banana")  // 可变列表
    mutableList.add("cherry")  // 合法
4. mutableListOf()
  • 本质 :创建实现 MutableList 接口的可变列表,默认是 ArrayList

  • 特点

    • 类型声明为 MutableList,更抽象,允许未来更换实现(如切换为 LinkedList)。
    • 初始化语法更简洁,支持默认参数。
  • 示例

    Kotlin 复制代码
    val mutableList: MutableList<String> = mutableListOf("a", "b")  // 可变列表
    mutableList.add("c")  // 合法

三、关键差异总结

1. 可变性
  • 不可变listOf() 创建的列表无法修改,适合作为只读数据容器。
  • 可变ArrayList()arrayListOf()mutableListOf() 创建的列表支持增删改操作。
2. 类型声明
  • listOf() 返回 List<T>,仅包含只读方法(如 get()size)。
  • mutableListOf() 返回 MutableList<T>,包含修改方法(如 add()remove())。
  • ArrayList()arrayListOf() 返回具体类 ArrayList<T>,可调用 ArrayList 特有的方法(如 trimToSize())。
3. 性能与场景
  • 不可变列表:适合作为函数参数或返回值,保证数据不被修改,且内存占用优化。
  • 可变列表 :需要动态修改数据时使用,arrayListOf()mutableListOf() 按需选择。

四、使用建议

  1. 优先使用 listOf():当不需要修改列表时,不可变集合更安全。
  2. 优先使用 mutableListOf():需要可变列表时,接口抽象性更好。
  3. 使用 arrayListOf() :需要调用 ArrayList 特有方法时(如 ensureCapacity())。
  4. 避免直接 ArrayList() :除非需要显式指定初始容量(如 ArrayList(100))。

五、常见误区

  • 混淆类型与可变性List 是只读接口,MutableList 是可变接口,与具体实现(如 ArrayList)无关。

  • 错误转换不可变列表

    Kotlin 复制代码
    val immutable = listOf("a", "b")
    val mutable = immutable as MutableList  // 运行时抛出 ClassCastException!

    正确做法:val mutable = mutableListOf<String>().apply { addAll(immutable) }

通过理解这些差异,可在 Kotlin 中更安全、高效地使用集合。

相关推荐
zhangphil2 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
小书房3 小时前
Kotlin使用体验及理解1
android·开发语言·kotlin
Kapaseker3 小时前
我想让同事知道我很懂 Compose 怎么办?
android·kotlin
jinanwuhuaguo17 小时前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw
jinanwuhuaguo21 小时前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
zhangphil1 天前
Android sql查媒体数据封装room Dao构造AndroidViewModel,RecyclerView宫格展示,Kotlin
android·kotlin
jinanwuhuaguo1 天前
反熵共同体——OpenClaw的宇宙热力学本体论(第十七篇)
大数据·人工智能·安全·架构·kotlin·openclaw
pengyu1 天前
【Kotlin 协程修仙录 · 筑基境 · 中阶】 | 身份证与通行证:CoroutineContext 的深度解剖
android·kotlin
夏沫琅琊1 天前
android 短信读取与导出技术
android·kotlin
Kapaseker1 天前
客官,你误会 Compose Strong Skipping 了
android·kotlin