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

Sai*_*Sai 71 kotlin

private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()
Run Code Online (Sandbox Code Playgroud)

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

或者有什么重大区别?

pdp*_*dpi 97

两者之间的唯一区别是沟通你的意图.

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

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

现在,让我们说Kotlin的未来版本将更mutableListOf改为返回不同类型的列表.

更糟糕的是,如果他们认为新的实施对大多数用例来说效果更好,那么Kotlin团队只会做出改变.mutableListOf然后,您可以透明地使用新的列表实现,并且您可以免费获得更好的行为.一起去的mutableListOf,如果这听起来像你的情况.

另一方面,也许你花了很多时间考虑你的问题,并认为这ArrayList 真的是最适合你的问题,而且你不想冒险被转移到次优的东西.那么你可能想要ArrayList直接使用,或者使用arrayListOf工厂功能(ArrayList特定的模拟mutableListOf).


mie*_*sol 19

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

ArrayList<String>()是一个构造函数调用,无法内联.

换句话说

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
Run Code Online (Sandbox Code Playgroud)
  • a 是类型的 MutableList<String>
  • b 是类型的 ArrayList<String>

在运行时都ab将举行的一个实例ArrayList.

请注意,当与混合时内联是特别有用的类型物化这证明的存在listOf,mutableListOf和类似物.

  • 所以没有区别。 (2认同)
  • `a`和`b`有不同的声明类型 - 所以编译时有区别. (2认同)

小智 15

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

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

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

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

经验法则是,您应该更喜欢事物的接口版本(mutableListOf()),除非您确实有理由关心底层结构的确切细节。

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


azi*_*ian 8

正如您在消息来源中看到的:

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Run Code Online (Sandbox Code Playgroud)

所以,没有区别,只是一种方便的方法.

  • 我会把“方便”放在引号中。在 MutableList *实际上* 有不同的实现之前,提供一个与另一个核心对象做同样事情的核心对象是令人困惑的,而且一点也不方便。:( (2认同)
  • @MikeWilliamson,因为数组列表是Java中最令人困惑的事情之一,对我来说它要么是数组,要么是列表,但两者都是?我的头爆炸了。我发现可变列表对于这种奇怪的命名类型来说是一个完美的名字。 (2认同)