Kotlin中ArrayList <string>()和mutableListOf <string>()之间的区别

时间:2017-03-30 09:54:17

标签: kotlin

private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

两者都是可变列表,那么两个关键字mutableListOfArrayList的重点是什么?

或者有什么重大区别?

5 个答案:

答案 0 :(得分:71)

两者之间的唯一区别就是传达你的意图。

当你写val a = mutableListOf()时,你说“我想要一个可变列表,我并不特别关心实现”。当你写作val a = ArrayList()时,你会说“我特别想要一个ArrayList”。

实际上,在Kotlin编译到JVM的当前实现中,调用mutableListOf将产生ArrayList,并且行为没有区别:一旦构建了列表,一切都会表现相同

现在,假设未来版本的Kotlin更改mutableListOf以返回不同类型的列表。

如果他们认为新的实施对大多数用例来说效果更好,那么Kotlin团队只会做出改变。然后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>

在运行时,ab都会保留ArrayList的实例。

请注意,与type reification结合使用时,内联特别有用,可证明listOfmutableListOf等存在的合理性。

答案 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()