private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
两者都是可变列表,那么两个关键字
mutableListOf
或ArrayList
有什么意义?
或者有什么重大区别吗?
两者之间的唯一区别在于传达您的意图。
当你写
val a = mutableListOf()
时,你是在说“我想要一个可变列表,而且我并不特别关心实现”。相反,当您写 val a = ArrayList()
时,您是在说“我特别想要一个 ArrayList
”。
实际上,在 Kotlin 编译到 JVM 的当前实现中,调用
mutableListOf
将产生 ArrayList
,并且行为没有区别:一旦构建了列表,所有内容都会表现相同。
现在,假设 Kotlin 的未来版本会更改
mutableListOf
以返回不同类型的列表。
更有可能的是,Kotlin 团队只有在认为新实现更适合大多数用例时才会做出更改。然后,
mutableListOf
会让您透明地使用新的列表实现,并且您将免费获得更好的行为。如果这听起来像你的情况,请选择 mutableListOf
。
另一方面,也许你花了很多时间思考你的问题,并认为
ArrayList
真的最适合你的问题,并且你不想冒险转向次优的东西。那么您可能想直接使用 ArrayList
,或者使用 arrayListOf
工厂函数(ArrayList
特定于 mutableListOf
的类似物)。
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
等的存在。
在幕后,
mutableListOf()
和arrayListOf()
都创建了ArrayList的实例。 ArrayList 是一个恰好实现了 MutableList 接口的类。
唯一的区别是
arrayListOf()
将 ArrayList 作为实际的 ArrayList 返回。 mutableListOf()
返回一个 MutableList,因此实际的 ArrayList 被“伪装”为 MutableList 接口所描述的部分。
实际上,区别在于 ArrayList 有一些不属于 MutableList 接口的方法(trimToSize 和 EnsureCapacity)。
从哲学上讲,区别在于 MutableList 只关心返回对象的行为。它只是返回“类似于 MutableList 的东西”。 ArrayList关心对象的“结构”。它允许您直接操作对象分配的内存(trimToSize)。
经验法则是,您应该更喜欢事物的界面版本
(mutableListOf())
,除非您确实有理由关心底层结构的确切细节。
或者,换句话说,如果您不知道想要哪个,请先选择 mutableListOf。
正如您在来源中看到的:
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
所以,没有什么区别,只是一种方便的方法。