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
类实例。 - 特点:需显式指定类型(除非通过初始化值推断)。
- 示例:
val list = ArrayList<String>() // 创建空的可变列表 list.add("apple") list.add("banana")
2. listOf()
- 本质:创建不可变的只读列表(实现
List
接口)。 - 特点:
- 由 Kotlin 标准库提供,优化了空列表和单元素列表的内存占用。
- 调用
add()
、remove()
等修改方法会抛出UnsupportedOperationException
。
- 示例:
val immutableList = listOf("a", "b", "c") // 不可变列表 // immutableList.add("d") // 编译错误:List 接口无 add() 方法
3. arrayListOf()
- 本质:创建可变的
ArrayList
实例,是ArrayList()
的快捷方式。 - 特点:
- 无需显式指定泛型类型(通过初始化值推断)。
- 完全等价于
ArrayList<T>().apply { addAll(...) }
。
- 示例:
val mutableList = arrayListOf("apple", "banana") // 可变列表 mutableList.add("cherry") // 合法
4. mutableListOf()
- 本质:创建实现
MutableList
接口的可变列表,默认是ArrayList
。 - 特点:
- 类型声明为
MutableList
,更抽象,允许未来更换实现(如切换为LinkedList
)。 - 初始化语法更简洁,支持默认参数。
- 类型声明为
- 示例:
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()
按需选择。
四、使用建议
- 优先使用
listOf()
:当不需要修改列表时,不可变集合更安全。 - 优先使用
mutableListOf()
:需要可变列表时,接口抽象性更好。 - 使用
arrayListOf()
:需要调用ArrayList
特有方法时(如ensureCapacity()
)。 - 避免直接
ArrayList()
:除非需要显式指定初始容量(如ArrayList(100)
)。
五、常见误区
- 混淆类型与可变性:
List
是只读接口,MutableList
是可变接口,与具体实现(如ArrayList
)无关。 - 错误转换不可变列表:
val immutable = listOf("a", "b") val mutable = immutable as MutableList // 运行时抛出 ClassCastException!
正确做法:val mutable = mutableListOf<String>().apply { addAll(immutable) }
通过理解这些差异,可在 Kotlin 中更安全、高效地使用集合。