Solución:
La única diferencia entre los dos es comunicar su intención.
Cuando escribes val a = mutableListOf()
, estás 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 en la JVM, llamar mutableListOf
producirá un ArrayList
, y no hay diferencia en el comportamiento: una vez que se crea la lista, todo se comportará igual.
Ahora, digamos que cambia una versión futura de Kotlin mutableListOf
para devolver un tipo diferente de lista.
Lo más probable es que el equipo de Kotlin solo haga ese cambio si se da cuenta de que la nueva implementación funciona mejor para la mayoría de los casos de uso. mutableListOf
entonces tendría que usar esa nueva implementación de lista de forma transparente, y obtendría ese mejor comportamiento de forma gratuita. Ir con mutableListOf
si ese suena como tu caso.
Por otro lado, tal vez pasaste mucho tiempo pensando en tu problema y pensaste que ArrayList
De Verdad es la que mejor se adapta a su problema y no quiere arriesgarse a que lo trasladen a algo que no sea óptimo. Entonces probablemente quieras usar ArrayList
directamente, o utilice el arrayListOf
función de fábrica (una ArrayList
-análogo específico de mutableListOf
).
mutableListOf<T>()
es una invocación de función en línea que devuelve un
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, dado:
val a = mutableListOf<String>()
val b = ArrayList<String>()
-
a
es de tipoMutableList<String>
-
b
es de tipoArrayList<String>
En tiempo de ejecución, ambos a
y b
tendrá una instancia de ArrayList
.
Tenga en cuenta que la inserción es particularmente útil cuando se combina con la reificación de tipos, que justifica la existencia de listOf
, mutableListOf
y similares.
Como puede ver en las fuentes:
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Entonces, no hay diferencia, solo un método de conveniencia.