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
相关产品推荐
相关产品推荐

