在 Android 中需要列表的地方使用 Kotlin 的 MutableList 或 ArrayList

Mik*_*son 7 android arraylist kotlin mutablelist

我正在尝试学习在 Android 中做事的“Kotlin 原生方式”,同时既不是 Kotlin、Java 也不是 Android 开发的专家。具体来说,何时使用ArrayListvsMutableList

在我看来,MutableList应该尽可能选择。然而,如果我查看 Android 示例,他们似乎总是选择ArrayList(就我目前发现的而言)。

下面是一个工作示例的片段,它使用ArrayList并扩展了 Java 的RecyclerView.Adapter.

class PersonListAdapter(private val list: ArrayList<Person>,
                        private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Run Code Online (Sandbox Code Playgroud)

问题 1)

即使我是从 Android 的 Java 代码中借用的,我是否可以简单地将上述代码编写如下(注意MutableList<>而不是ArrayList<>)?

class PersonListAdapter(private val list: MutableList<Person>,
                        private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Run Code Online (Sandbox Code Playgroud)

问题2)

总是使用MutableListover真的更好ArrayList吗?主要原因是什么?我上面提供的一些链接让我无法理解,但在我看来,这MutableList是一个更松散的实现,在未来更有能力改变和改进。那正确吗?

The*_*rer 12

ArrayList 是 Kotlin 中 MutableList 接口的实现:

class ArrayList<E> : MutableList<E>, RandomAccess
Run Code Online (Sandbox Code Playgroud)

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/index.html

该答案可能表明应尽可能选择 MutableList,但 ArrayListMutableList。因此,如果您已经在使用 ArrayList,那么真的没有理由改用 MutableList,尤其是因为您实际上无法直接创建它的实例(MutableList 是一个接口,而不是一个类)。

事实上,如果你看一下mutableListOf()Kotlin 扩展方法:

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

您可以看到它只返回您提供的元素的 ArrayList。

  • @MikeWilliamson 它返回一个 ArrayList 的实例,但在 MutableList 类型下。我不知道你有什么理由想要使用它,但它与 `arrayListOf()` 不同。 (2认同)

Vla*_*lad 10

区别在于:

  • 如果你使用ArrayList()你明确地说“我希望这是一个ArrayList实现MutableList并且永远不会改变其他任何东西”。

  • 如果你使用mutableListOf()它就像说“给我默认的MutableList实现”。

MutableList( mutableListOf()) 的当前默认实现返回一个ArrayList. 如果在将来(不太可能)发生变化的情况下(如果设计了一个新的更有效的实现),这可能会更改为...mutableListOf(): MutableList<T> = SomeNewMoreEfficientList().

在这种情况下,您在代码中使用的任何地方ArrayList()都将保留ArrayList. 无论您在何处使用它,mutableListOf()它都会从 更改ArrayList为出色命名的SomeNewMoreEfficientList.