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 ArrayListrealmente 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).
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.
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. :(
mutableListOf
tampocoArrayList
palabras clave en KotlinRespuestas:
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 unArrayList
".En la práctica, en la implementación actual de la compilación de Kotlin en la JVM, la llamada
mutableListOf
producirá unArrayList
, 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.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.
mutableListOf
entonces tendría que usar esa nueva implementación de lista de manera transparente, y obtendría ese mejor comportamiento de forma gratuita. VayamutableListOf
si 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 usarArrayList
directamente o usar laarrayListOf
función de fábrica (unArrayList
análogo específico demutableListOf
).fuente
mutableListOf<T>()
es una invocación de función en línea que devuelve unMutableList<T>
. A partir de hoy,mutableListOf
devuelve una instancia deArrayList
.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
yb
mantendrán una instancia deArrayList
.Nota que inlining es particularmente útil cuando se combina con el tipo cosificación , lo que justifica la existencia de
listOf
,mutableListOf
y similares.fuente
a
yb
tienen un tipo declarado diferente, por lo que hay una diferencia en el momento de la compilación.val b = arrayListOf<String>()
Como puede ver en las fuentes :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Entonces, no hay diferencia, solo un método de conveniencia.
fuente