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 中更安全、高效地使用集合。

相关推荐
Monkey-旭1 天前
Android Bitmap 完全指南:从基础到高级优化
android·java·人工智能·计算机视觉·kotlin·位图·bitmap
Monkey-旭2 天前
深入理解 Kotlin Flow:异步数据流处理的艺术
android·开发语言·kotlin·响应式编程·flow
程序员江同学3 天前
Kotlin 技术月报 | 2025 年 7 月
android·kotlin
_frank2223 天前
kotlin使用mybatis plus lambdaQuery报错
开发语言·kotlin·mybatis
Bryce李小白3 天前
Kotlin实现Retrofit风格的网络请求封装
网络·kotlin·retrofit
ZhuYuxi3333 天前
【Kotlin】const 修饰的编译期常量
android·开发语言·kotlin
jzlhll1233 天前
kotlin StateFlow的两个问题和使用场景探讨
kotlin·stateflow
Bryce李小白3 天前
Kotlin 实现 MVVM 架构设计总结
android·开发语言·kotlin
Kiri霧3 天前
Kotlin位运算
android·开发语言·kotlin
xjdkxnhcoskxbco3 天前
kotlin基础【3】
android·开发语言·kotlin