You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中array(arrayOf)、list(listOf)与arraylist(arrayListOf)的区别及正确用法

Kotlin中array、List、ArrayList的区别与正确用法

一、三者本质与核心区别

1. Array(arrayOf()创建)

  • 本质是Kotlin泛型数组类,对应Java原生数组(比如Array<String>对应String[],IntArray对应int[])。
  • 大小固定不可变,创建后无法扩容/缩容,但可以修改元素的值。
  • 基本类型推荐用专用数组类(如intArrayOf、doubleArrayOf),避免自动装箱带来的性能开销。

2. 只读List(listOf()创建)

  • 返回kotlin.collections.List接口的不可变实现,对外仅暴露只读方法。
  • 完全不可变:既不能添加/删除元素,也不能修改已有元素值,编译阶段就会阻止修改操作。
  • 底层实现无需用户关心,只需明确它是不可变集合即可。

3. ArrayList(arrayListOf()创建)

  • 本质就是Java的java.util.ArrayList,实现了Kotlin的MutableList接口。
  • 可变集合:支持添加、删除、修改元素,大小会自动动态扩容。
  • 可无缝与Java代码互操作,适合元素数量动态变化的场景。

二、正确使用场景

用arrayOf()的情况

  • 需要固定大小的集合,元素数量不会变化;
  • 需要和Java原生数组交互时;
  • 对性能要求极高,需要直接内存寻址的场景(如大量数值运算)。
// 示例:固定大小的字符串数组
val fruits = arrayOf("Apple", "Banana", "Orange")
fruits[1] = "Grape" // 允许修改元素值

// 基本类型用专用数组,避免装箱
val scores = intArrayOf(85, 90, 78)

用listOf()的情况

  • 数据不需要被修改,比如返回固定配置项、常量列表;
  • 作为方法参数,确保传入的数据不会被方法内部修改;
  • 追求线程安全(不可变集合天然线程安全)。
// 示例:不可变的配置列表
val envTypes = listOf("dev", "test", "prod")
// envTypes.add("uat") → 编译错误,不允许修改

// 方法参数用只读List,避免外部数据被修改
fun printItems(items: List<String>) {
    items.forEach { println(it) }
    // items.remove(it) → 编译错误
}

用arrayListOf()的情况

  • 需要动态添加、删除元素,比如逐步收集数据;
  • 需要直接操作ArrayList的特有方法(比如ensureCapacity);
  • 和Java代码交互时明确需要java.util.ArrayList实例。
// 示例:动态收集用户数据
val users = arrayListOf<User>()
users.add(User("Alice", 25))
users.removeAt(0)
users[0] = User("Bob", 30)

补充:如果仅需要可变List,优先用mutableListOf(),它返回MutableList接口而非具体实现,更符合面向接口编程原则;只有必须用到ArrayList特定功能时,再用arrayListOf()。

内容的提问来源于stack exchange,提问作者Beby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:55:21