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 ArrayListvraiment 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).
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.
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é. :(
mutableListOf
neArrayList
sont dans KotlinRéponses:
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
mutableListOf
produira unArrayList
, 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
mutableListOf
pour 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.
mutableListOf
vous obligerait alors à utiliser cette nouvelle implémentation de liste de manière transparente, et vous obtiendriez ce meilleur comportement gratuitement. Allez-ymutableListOf
si 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 utiliserArrayList
directement, soit utiliser laarrayListOf
fonction d'usine (unArrayList
analogue spécifique àmutableListOf
).la source
mutableListOf<T>()
est une invocation de fonction en ligne qui renvoie unMutableList<T>
. À partir d'aujourd'hui,mutableListOf
renvoie une instance deArrayList
.ArrayList<String>()
est un appel de constructeur et ne peut pas être inséré.En d'autres termes, étant donné:
a
est de typeMutableList<String>
b
est de typeArrayList<String>
Au moment de l'exécution, les deux
a
etb
contiendront une instance deArrayList
.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
,mutableListOf
etc.la source
a
etb
ont un type déclaré différent - il y a donc une différence au moment de la compilation.val b = arrayListOf<String>()
Comme vous pouvez le voir dans les sources :
Donc, il n'y a pas de différence, juste une méthode pratique.
la source