private val repositories = mutableListOf<String>() private val repositories = ArrayList<String>() Ambas son listas mutables, entonces, ¿cuál es el punto de dos palabras clave mutableListOf o ArrayList ?
o hay alguna diferencia importante?
Debajo de las cubiertas, tanto mutableListOf() como arrayListOf() crean una instancia de ArrayList. ArrayList es una clase que implementa la interfaz MutableList.
La única diferencia es que arrayListOf() devuelve ArrayList como un ArrayList real. mutableListOf() devuelve una MutableList, por lo que la ArrayList real está "disfrazada" como las partes descritas por la interfaz MutableList.
La diferencia, en la práctica, es que ArrayList tiene algunos métodos que no forman parte de la interfaz de MutableList (trimToSize y sureCapacity).
La diferencia, filosóficamente, es que MutableList solo se preocupa por el comportamiento del objeto que se devuelve. Simplemente devuelve "algo que actúa como MutableList". El ArrayList se preocupa por la "estructura" del objeto. Le permite manipular directamente la memoria asignada por el objeto (trimToSize).
La regla general es que debe preferir la versión de interfaz de las cosas (mutableListOf()) a menos que realmente tenga una razón para preocuparse por los detalles exactos de la estructura subyacente.
O, en otras palabras, si no sabe cuál quiere, elija mutableListOf primero.
Como se puede ver en las fuentes :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()Entonces, no hay diferencia, solo un método de conveniencia.
mutableListOf<T>() es una invocación de función en línea que devuelve una MutableList<T> . A partir de hoy, mutableListOf devuelve una instancia de ArrayList .
ArrayList<String>() es una invocación de constructor y no se puede insertar en línea.
En otras palabras, dado:
val a = mutableListOf<String>() val b = ArrayList<String>()a es de tipo MutableList<String>b es de tipo ArrayList<String> En tiempo de ejecución, tanto a como b tendrán una instancia de ArrayList .
Tenga en cuenta que la inserción es particularmente útil cuando se combina con la reificación de tipos , lo que justifica la existencia de listOf , mutableListOf y similares.
La única diferencia entre los dos es comunicar tu intención.
Cuando escribe val a = mutableListOf() , está diciendo "Quiero una lista mutable, y no me importa especialmente la implementación". Cuando escribe, en cambio, val a = ArrayList() , está diciendo "Específicamente quiero una ArrayList ".
En la práctica, en la implementación actual de Kotlin compilando en JVM, llamar a mutableListOf producirá una ArrayList y no hay diferencia en el comportamiento: una vez que se crea la lista, todo se comportará igual.
Ahora, digamos que una versión futura de Kotlin cambia mutableListOf para devolver un tipo diferente de lista.
Lo más probable es que el equipo de Kotlin solo haga ese cambio si cree que la nueva implementación funciona mejor para la mayoría de los casos de uso. mutableListOf entonces haría que usara esa nueva implementación de lista de forma transparente, y obtendría ese mejor comportamiento de forma gratuita. Vaya con mutableListOf si eso suena como su caso.
Por otro lado, tal vez pasó mucho tiempo pensando en su problema y pensó que ArrayList realmente es la mejor opción para su problema, y no quiere arriesgarse a que lo cambien a algo subóptimo. Entonces probablemente desee usar ArrayList directamente o usar la función de fábrica arrayListOf (un análogo específico de ArrayList para mutableListOf ).