initialize - Diferencia entre ArrayList<String>() y mutableListOf<String>() en Kotlin
list object kotlin (3)
Como puedes ver en las sources :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Entonces, no hay diferencia, solo un método de conveniencia.
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?
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 particularmente la implementación".
Cuando escribes, en cambio,
val a = ArrayList()
, estás diciendo "Quiero específicamente una
ArrayList
".
En la práctica, en la implementación actual de Kotlin compilando a la JVM, llamar a
mutableListOf
producirá una
ArrayList
, y no hay diferencia en el comportamiento: una vez que se construye la lista, todo se comportará igual.
Ahora, supongamos que una versión futura de Kotlin cambia
mutableListOf
para devolver un tipo diferente de lista.
Más probable que no sea así, el equipo de Kotlin solo haría ese cambio si creen que la nueva implementación funciona mejor para la mayoría de los casos de uso.
mutableListOf
haría usar esa nueva implementación de la 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 pasaste un montón de tiempo pensando en tu problema y pensaste que
ArrayList
realmente
es la mejor opción para tu problema, y no quieres arriesgarte a que te trasladen a algo subóptimo.
Entonces, probablemente desee utilizar
ArrayList
directamente o utilizar la función de fábrica
arrayListOf
(un análogo específico de
ArrayList
a
mutableListOf
).
mutableListOf<T>()
es una invocación de función en línea que devuelve
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 otras palabras dadas
val a = mutableListOf<String>()
val b = ArrayList<String>()
-
a
es de tipoMutableList<String>
-
b
es de tipoArrayList<String>
En tiempo de ejecución,
a
y
b
contendrán una instancia de
ArrayList<String>()
.
Tenga en cuenta que la alineación es particularmente útil cuando se combina con la
reificación de tipos
que justifica la existencia de
listOf
,
mutableListOf
y similares.