Kotlin 中ArrayList、listOf、arrayListOf 和 mutableListOf区别

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

一、基本定义与类型

创建方式 类型 可变性 底层实现
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 中更安全、高效地使用集合。

相关推荐
alexhilton1 天前
模块化Jetpack Compose架构
android·kotlin·android jetpack
mmsx1 天前
Android 测绘计算工程化:七四参数、高程拟合与单位系统
android·kotlin
事圆则缓1 天前
Kotlin Flow、StateFlow、SharedFlow 全解析:冷流、热流与 Android 状态管理
android·kotlin·php
应用市场1 天前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
Kapaseker1 天前
Android 以后可能不会再有横竖屏适配了
android·kotlin
墨天梦1 天前
B13_通知图片相机与影音
android·数码相机·kotlin
传奇开心果编程2 天前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
mmsx2 天前
Android 地图数据链路:从 GDAL、KML 到多引擎适配
android·kotlin
事圆则缓2 天前
Kotlin 泛型方差实战:out、in、星投影与类型擦除
android·开发语言·kotlin
传奇开心果编程2 天前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer