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


101
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

两者都是可变列表,那么两个关键字mutableListOf或的意义是ArrayList什么?

或有什么重大区别?


6
无论是mutableListOf也不ArrayList是科特林关键字
伊利亚

Answers:


141

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

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

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

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

Kotlin团队很可能只有在认为新的实现在大多数用例下都能更好地工作时,才进行此更改。mutableListOf然后,您可以透明地使用该新列表实现,并且可以免费获得更好的行为。mutableListOf如果这听起来像您的情况,那就去吧。

另一方面,也许您花了很多时间思考您的问题,并认为这ArrayList 确实是最适合您的问题的方法,并且您不想冒险陷入次优状态。然后,您可能想要ArrayList直接使用或使用arrayListOf工厂功能(的ArrayList特定于-的类似物mutableListOf)。


21

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

ArrayList<String>() 是构造函数调用,不能内联。

换句话说,给出:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a 是类型 MutableList<String>
  • b 是类型 ArrayList<String>

在运行时,ab都将持有的实例ArrayList

注意,当具有组合内联是特别有用的类型物化,这证明存在listOfmutableListOf等等。


2
因此没有区别。

2
a并且b具有不同的声明类型-因此编译时有所不同。
miensol

可以内联为val b = arrayListOf<String>()
Vlad19,19年

8

如您在源代码中看到的:

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

因此,没有区别,只是一种方便的方法。


1
我会在报价中加上“方便”。在MutableList实际上具有不同的实现之前,提供一个与另一个核心对象做同样的事情的核心对象是令人困惑的,而且一点也不方便。:(
Mike Williamson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.