Antworten:
Der einzige Unterschied zwischen den beiden besteht darin, Ihre Absicht mitzuteilen.
Wenn Sie schreiben val a = mutableListOf()
, sagen Sie: "Ich möchte eine veränderbare Liste, und die Implementierung ist mir nicht besonders wichtig." Wenn Sie stattdessen schreiben, val a = ArrayList()
sagen Sie "Ich möchte speziell eine ArrayList
".
In der Praxis führt der Aufruf in der aktuellen Implementierung der Kotlin-Kompilierung in die JVM zu mutableListOf
einem ArrayList
, und es gibt keinen Unterschied im Verhalten: Sobald die Liste erstellt ist, verhält sich alles gleich.
Angenommen, eine zukünftige Version von Kotlin ändert sich mutableListOf
, um einen anderen Listentyp zurückzugeben.
Wahrscheinlich würde das Kotlin-Team diese Änderung nur vornehmen, wenn es feststellt, dass die neue Implementierung für die meisten Anwendungsfälle besser funktioniert. mutableListOf
Wenn Sie dann diese neue Listenimplementierung transparent verwenden, erhalten Sie dieses bessere Verhalten kostenlos. Gehen Sie mit, mutableListOf
wenn das nach Ihrem Fall klingt.
Auf der anderen Seite haben Sie vielleicht eine Menge Zeit damit verbracht, über Ihr Problem nachzudenken, und festgestellt, dass dies ArrayList
wirklich am besten zu Ihrem Problem passt, und Sie möchten nicht riskieren, sich auf etwas Suboptimales zu konzentrieren. Dann möchten Sie wahrscheinlich entweder ArrayList
direkt oder die arrayListOf
Factory-Funktion verwenden (ein ArrayList
spezifisches Analogon zu mutableListOf
).
mutableListOf<T>()
ist ein Inline-Funktionsaufruf, der a zurückgibt
MutableList<T>
. Gibt ab heute mutableListOf
eine Instanz von zurück ArrayList
.
ArrayList<String>()
ist ein Konstruktoraufruf und kann nicht eingefügt werden.
Mit anderen Worten, gegeben:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a
ist vom Typ MutableList<String>
b
ist vom Typ ArrayList<String>
Zur Laufzeit halten beide a
und b
eine Instanz von ArrayList
.
Beachten Sie, dass inlining ist besonders nützlich , wenn sie mit kombinierten Typ Verdinglichung , die die Existenz rechtfertigt listOf
, mutableListOf
und dergleichen.
a
und b
haben einen anderen deklarierten Typ - es gibt also einen Unterschied bei der Kompilierung.
val b = arrayListOf<String>()
Wie Sie in Quellen sehen können :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Es gibt also keinen Unterschied, nur eine bequeme Methode.
mutableListOf
nochArrayList
sind Schlüsselwörter in Kotlin