Diferencia entre ArrayList <String> () y mutableListOf <String> () en Kotlin

102
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Ambos son una lista mutable, entonces, ¿cuál es el punto de dos palabras clave mutableListOfo ArrayList?

o hay alguna diferencia importante?

Sai
fuente
6
Ni mutableListOftampoco ArrayListpalabras clave en Kotlin
Ilya

Respuestas:

143

La única diferencia entre los dos es comunicar su intención.

Cuando escribe val a = mutableListOf(), está diciendo "Quiero una lista mutable y no me importa particularmente la implementación". Cuando escribe, en cambio, val a = ArrayList()está diciendo "específicamente quiero un ArrayList".

En la práctica, en la implementación actual de la compilación de Kotlin en la JVM, la llamada mutableListOfproducirá un 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 mutableListOfpara devolver un tipo diferente de lista.

Es más probable que no, el equipo de Kotlin solo haría ese cambio si se da cuenta de que la nueva implementación funciona mejor para la mayoría de los casos de uso. mutableListOfentonces tendría que usar esa nueva implementación de lista de manera transparente, y obtendría ese mejor comportamiento de forma gratuita. Vaya mutableListOfsi ese suena como su caso.

Por otro lado, tal vez dedicó mucho tiempo a pensar en su problema y pensó que ArrayList realmente es la mejor opción para su problema, y ​​no quiere arriesgarse a que lo muevan a algo que no sea óptimo. Entonces probablemente desee usar ArrayListdirectamente o usar la arrayListOffunción de fábrica (un ArrayListanálogo específico de mutableListOf).

pdpi
fuente
21

mutableListOf<T>()es una invocación de función en línea que devuelve un MutableList<T>. A partir de hoy, mutableListOfdevuelve 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 tipo MutableList<String>
  • b es de tipo ArrayList<String>

En tiempo de ejecución, ambos ay bmantendrán una instancia de ArrayList.

Nota que inlining es particularmente útil cuando se combina con el tipo cosificación , lo que justifica la existencia de listOf, mutableListOfy similares.

miensol
fuente
2
Entonces no hay diferencia.
Sai
2
ay btienen un tipo declarado diferente, por lo que hay una diferencia en el momento de la compilación.
miensol
Se puede insertar comoval b = arrayListOf<String>()
Vlad
8

Como puede ver en las fuentes :

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

Entonces, no hay diferencia, solo un método de conveniencia.

azizbeko
fuente
1
Y pondría "conveniencia" entre comillas. Hasta MutableList realidad tiene una aplicación diferente, proporcionando un objeto central que hace lo mismo que otro objeto central es confuso, y no en todo su conveniencia. :(
Mike Williamson