Kotlin 中 ArrayList<String>() 和 mutableListOf<String>() 的区别

问题描述 投票:0回答:4
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

两者都是可变列表,那么两个关键字

mutableListOf
ArrayList
有什么意义?

或者有什么重大区别吗?

kotlin
4个回答
216
投票

两者之间的唯一区别在于传达您的意图。

当你写

val a = mutableListOf()
时,你是在说“我想要一个可变列表,而且我并不特别关心实现”。相反,当您写
val a = ArrayList()
时,您是在说“我特别想要一个
ArrayList
”。

实际上,在 Kotlin 编译到 JVM 的当前实现中,调用

mutableListOf
将产生
ArrayList
,并且行为没有区别:一旦构建了列表,所有内容都会表现相同。

现在,假设 Kotlin 的未来版本会更改

mutableListOf
以返回不同类型的列表。

更有可能的是,Kotlin 团队只有在认为新实现更适合大多数用例时才会做出更改。然后,

mutableListOf
会让您透明地使用新的列表实现,并且您将免费获得更好的行为。如果这听起来像你的情况,请选择
mutableListOf

另一方面,也许你花了很多时间思考你的问题,并认为

ArrayList
真的最适合你的问题,并且你不想冒险转向次优的东西。那么您可能想直接使用
ArrayList
,或者使用
arrayListOf
工厂函数(
ArrayList
特定于
mutableListOf
的类似物)。


34
投票

mutableListOf<T>()
是一个内联函数调用,返回一个
MutableList<T>
。截至今天,
mutableListOf
确实返回了
ArrayList
的实例。

ArrayList<String>()
是构造函数调用,不能内联。

换句话说,给定:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a
    属于类型
    MutableList<String>
  • b
    属于类型
    ArrayList<String>

在运行时,

a
b
都将保存
ArrayList
的实例。

请注意,内联与 type reification 结合使用时特别有用,这证明了

listOf
mutableListOf
等的存在。


16
投票

在幕后,

mutableListOf()
arrayListOf()
都创建了ArrayList的实例。 ArrayList 是一个恰好实现了 MutableList 接口的类。

唯一的区别是

arrayListOf()
将 ArrayList 作为实际的 ArrayList 返回。
mutableListOf()
返回一个 MutableList,因此实际的 ArrayList 被“伪装”为 MutableList 接口所描述的部分。

实际上,区别在于 ArrayList 有一些不属于 MutableList 接口的方法(trimToSize 和 EnsureCapacity)。

从哲学上讲,区别在于 MutableList 只关心返回对象的行为。它只是返回“类似于 MutableList 的东西”。 ArrayList关心对象的“结构”。它允许您直接操作对象分配的内存(trimToSize)。

经验法则是,您应该更喜欢事物的界面版本

(mutableListOf())
,除非您确实有理由关心底层结构的确切细节。

或者,换句话说,如果您不知道想要哪个,请先选择 mutableListOf。


13
投票

正如您在来源中看到的:

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

所以,没有什么区别,只是一种方便的方法。

© www.soinside.com 2019 - 2024. All rights reserved.