private val repositories = mutableListOf<String>() private val repositories = ArrayList<String>()
Both are mutable list, then what is the point of two keywords mutableListOf or ArrayList?
mutableListOf
ArrayList
or is there any major difference?
正如你在 消息来源中看到的:
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
所以,没有区别,只是一个方便的方法。
mutableListOf<T>() 是一个内联函数调用,它返回一个 到目前为止,mutableListOf确实返回了 ArrayList的一个实例。
mutableListOf<T>()
ArrayList<String>() 是构造函数调用,不能内联。
ArrayList<String>()
换句话说,给定:
val a = mutableListOf<String>() val b = ArrayList<String>()
a
MutableList<String>
b
ArrayList<String>
在运行时,a和 b都将保存 ArrayList的一个实例。
注意,当与 类型具体化类型具体化结合时,内联特别有用,它证明了 listOf、 mutableListOf等等的存在。
listOf
两者之间唯一的区别是传达你的意图。
当您编写 val a = mutableListOf()时,您说的是“我想要一个可变的列表,而且我并不特别关心实现”。相反,当你写 val a = ArrayList()的时候,你是在说“我特别想要一个 ArrayList”。
val a = mutableListOf()
val a = ArrayList()
实际上,在目前 Kotlin 编译到 JVM 的实现中,调用 mutableListOf将产生一个 ArrayList,而且行为上没有区别: 一旦构建了列表,所有东西的行为都是一样的。
现在,假设 Kotlin 的未来版本更改 mutableListOf以返回不同类型的列表。
更有可能的是,Kotlin 团队只有在认为新的实现对大多数用例更有效的情况下才会做出这种改变。然后,mutableListOf会让您透明地使用新的列表实现,并且您可以免费获得更好的行为。如果这听起来像你的案子,那就用 mutableListOf吧。
另一方面,也许你花了很多时间思考你的问题,并认为 ArrayList 真的是最适合你的问题,你不想冒险被转移到次优的东西。然后,您可能要么直接使用 ArrayList,要么使用 arrayListOf工厂功能(ArrayList特定的类似于 mutableListOf)。
arrayListOf
在后台,mutableListOf ()和 arrayListOf ()都创建 ArrayList 的实例。ArrayList 是一个实现 MutableList 接口的类。
唯一的区别是 arrayListOf ()将 ArrayList 作为实际的 ArrayList 返回。MutableListOf ()返回一个 MutableList,因此实际的 ArrayList 被“伪装”为 MutableList 接口所描述的部分。
实际上,不同之处在于 ArrayList 有几个方法不是 MutableList 接口的一部分(triToSize 和 ensureScale)。
从哲学上讲,区别在于 MutableList 只关心被返回对象的行为。它只返回“类似 MutableList 的内容”。ArrayList 关注对象的“结构”。它允许您直接操作由对象分配的内存(trimToSize)。
经验法则是,您应该更喜欢事物的接口版本(mutableListOf ()) ,除非您确实有理由关心底层结构的确切细节。
或者,换句话说,如果您不知道要选择哪一个,请首先选择 mutableListOf。