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