Différence entre ArrayList <String> () et mutableListOf <String> () dans Kotlin

99
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Les deux sont une liste mutable, alors quel est l'intérêt de deux mots mutableListOf- clés ou ArrayList?

ou y a-t-il une différence majeure?

Sai
la source
6
Ni les mots clés mutableListOfne ArrayListsont dans Kotlin
Ilya

Réponses:

137

La seule différence entre les deux est de communiquer votre intention.

Lorsque vous écrivez val a = mutableListOf(), vous dites "Je veux une liste modifiable, et je ne me soucie pas particulièrement de l'implémentation". Lorsque vous écrivez, à la place, val a = ArrayList()vous dites "Je veux spécifiquement unArrayList ".

En pratique, dans l'implémentation actuelle de la compilation de Kotlin sur la JVM, l'appel mutableListOfproduira un ArrayList, et il n'y a pas de différence de comportement: une fois la liste construite, tout se comportera de la même manière.

Maintenant, disons qu'une future version de Kotlin change mutableListOfpour renvoyer un type de liste différent.

Plus probable qu'improbable, l'équipe Kotlin n'apporterait ce changement que si elle estimait que la nouvelle implémentation fonctionnait mieux pour la plupart des cas d'utilisation. mutableListOfvous obligerait alors à utiliser cette nouvelle implémentation de liste de manière transparente, et vous obtiendriez ce meilleur comportement gratuitement. Allez-y mutableListOfsi cela ressemble à votre cas.

D'un autre côté, peut-être avez-vous passé beaucoup de temps à réfléchir à votre problème, et avez-vous pensé que c'était ArrayList vraiment la meilleure solution pour votre problème, et vous ne voulez pas risquer d'être déplacé vers quelque chose de sous-optimal. Ensuite, vous voudrez probablement soit utiliser ArrayListdirectement, soit utiliser la arrayListOffonction d'usine (un ArrayListanalogue spécifique à mutableListOf).

pdpi
la source
21

mutableListOf<T>()est une invocation de fonction en ligne qui renvoie un MutableList<T>. À partir d'aujourd'hui, mutableListOfrenvoie une instance de ArrayList.

ArrayList<String>() est un appel de constructeur et ne peut pas être inséré.

En d'autres termes, étant donné:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a est de type MutableList<String>
  • b est de type ArrayList<String>

Au moment de l'exécution, les deux aet bcontiendront une instance de ArrayList.

Notez que l'inlining est particulièrement utile lorsqu'il est combiné avec la réification de type , ce qui justifie l'existence de listOf, mutableListOfetc.

miensol
la source
1
Il n'y a donc aucune différence.
Sai
2
aet bont un type déclaré différent - il y a donc une différence au moment de la compilation.
miensol
Il peut être inséré commeval b = arrayListOf<String>()
Vlad
8

Comme vous pouvez le voir dans les sources :

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

Donc, il n'y a pas de différence, juste une méthode pratique.

azizbek
la source
1
Et je mettrais «commodité» entre guillemets. Jusqu'à ce que MutableList ait réellement une implémentation différente, fournir un objet principal qui fait la même chose qu'un autre objet principal est déroutant, et pas du tout une commodité. :(
Mike Williamson