【问题标题】:Difference between ArrayList<String>() and mutableListOf<String>() in KotlinKotlin 中 ArrayList<String>() 和 mutableListOf<String>() 之间的区别
【发布时间】:2017-08-24 04:08:00
【问题描述】:
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

都是可变列表,那么mutableListOfArrayList这两个关键字有什么意义呢?

或者有什么大的不同吗?

【问题讨论】:

  • mutableListOfArrayList 都不是 Kotlin 中的关键字

标签: kotlin


【解决方案1】:

正如您在sources 中看到的:

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

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

【讨论】:

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

mutableListOf&lt;T&gt;() 是一个内联函数调用,它返回一个 MutableList&lt;T&gt;。截至今天,mutableListOf 确实返回了一个 ArrayList 的实例。

ArrayList&lt;String&gt;() 是构造函数调用,不能内联。

换句话说,给定:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • aMutableList&lt;String&gt; 类型
  • bArrayList&lt;String&gt; 类型

在运行时,ab 都将拥有一个 ArrayList 的实例。

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

【讨论】:

  • 所以没有区别。
  • ab 具有不同的声明类型 - 因此在编译时存在差异。
  • 可以内联为val b = arrayListOf&lt;String&gt;()
【解决方案3】:

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

当您写val a = mutableListOf() 时,您是在说“我想要一个可变列表,而且我并不特别关心实现”。相反,当您写 val a = ArrayList() 时,您是在说“我特别想要一个 ArrayList”。

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

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

如果 Kotlin 团队认为新的实现更适合大多数用例,他们可能只会做出这种改变。 mutableListOf 会让你透明地使用这个新的列表实现,你会免费获得更好的行为。如果这听起来像您的情况,请使用 mutableListOf

另一方面,也许你花了很多时间思考你的问题,并认为ArrayList 真的最适合你的问题,你不想冒险转移到次优的地方。那么您可能想要直接使用ArrayList,或者使用arrayListOf 工厂函数(ArrayList 特定的类似物mutableListOf)。

【讨论】:

    【解决方案4】:

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

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

    实际上,不同之处在于 ArrayList 有一些方法不属于 MutableList 接口(trimToSize 和 ensureCapacity)。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 2019-11-29
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      相关资源
      最近更新 更多