Differenza tra ArrayList <String> () e mutableListOf <String> () in Kotlin


102
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Entrambi sono elenchi mutabili, allora qual è il punto di due parole chiave mutableListOfo ArrayList?

o c'è qualche differenza importante?


6
mutableListOf, né ArrayListsono le parole chiave a Kotlin
Ilya

Risposte:


143

L'unica differenza tra i due è comunicare il tuo intento.

Quando scrivi val a = mutableListOf(), stai dicendo "Voglio un elenco modificabile e non mi interessa particolarmente l'implementazione". Quando scrivi, invece, val a = ArrayList()dici "Ne voglio espressamente uno ArrayList".

In pratica, nell'attuale implementazione della compilazione di Kotlin nella JVM, la chiamata mutableListOfprodurrà un ArrayList, e non c'è alcuna differenza di comportamento: una volta che l'elenco è stato costruito, tutto si comporterà allo stesso modo.

Supponiamo ora che una versione futura di Kotlin cambi mutableListOfper restituire un diverso tipo di elenco.

Più probabile che no, il team di Kotlin apporterebbe quel cambiamento solo se ritenessero che la nuova implementazione funzioni meglio per la maggior parte dei casi d'uso. mutableListOfvorrebbe quindi utilizzare la nuova implementazione dell'elenco in modo trasparente e ottenere quel comportamento migliore gratuitamente. Vai con mutableListOfse suona come il tuo caso.

D'altra parte, forse hai passato un sacco di tempo a pensare al tuo problema e hai capito che è ArrayList davvero la soluzione migliore per il tuo problema e non vuoi rischiare di essere spostato su qualcosa di non ottimale. Quindi probabilmente vorrai usare ArrayListdirettamente o usare la arrayListOffunzione factory (un ArrayListanalogo specifico di mutableListOf).


21

mutableListOf<T>()è una chiamata di funzione inline che restituisce un file MutableList<T>. Ad oggi, mutableListOfrestituisce un'istanza di ArrayList.

ArrayList<String>() è una chiamata di un costruttore e non può essere inline.

In altre parole, dato:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a è di tipo MutableList<String>
  • b è di tipo ArrayList<String>

In fase di esecuzione, sia ae bmanterranno un'istanza di ArrayList.

Notare che inlining è particolarmente utile quando combinato con tipo reificazione , che giustifica l'esistenza listOf, mutableListOfe simili.


2
Quindi non c'è differenza.
Sai

2
ae bhanno un tipo dichiarato diverso, quindi c'è una differenza in fase di compilazione.
miensol

Può essere inline comeval b = arrayListOf<String>()
Vlad

8

Come puoi vedere nelle fonti :

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

Quindi, non c'è differenza, solo un metodo conveniente.


1
E metterei "convenienza" tra virgolette. Fino a quando MutableList non ha effettivamente un'implementazione diversa, fornire un oggetto principale che fa la stessa cosa di un altro oggetto principale è fonte di confusione e non è affatto una comodità. :(
Mike Williamson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.