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?


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).


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.