Unterschied zwischen ArrayList <String> () und mutableListOf <String> () in Kotlin

99
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Beide sind veränderbare Listen. Wozu dienen dann zwei Schlüsselwörter mutableListOfoder ArrayList?

oder gibt es einen großen unterschied?

Sai
quelle
6
Weder mutableListOfnoch ArrayListsind Schlüsselwörter in Kotlin
Ilya

Antworten:

137

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 mutableListOfeinem 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. mutableListOfWenn Sie dann diese neue Listenimplementierung transparent verwenden, erhalten Sie dieses bessere Verhalten kostenlos. Gehen Sie mit, mutableListOfwenn 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 ArrayListdirekt oder die arrayListOfFactory-Funktion verwenden (ein ArrayListspezifisches Analogon zu mutableListOf).

pdpi
quelle
21

mutableListOf<T>()ist ein Inline-Funktionsaufruf, der a zurückgibt MutableList<T>. Gibt ab heute mutableListOfeine 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 aund beine Instanz von ArrayList.

Beachten Sie, dass inlining ist besonders nützlich , wenn sie mit kombinierten Typ Verdinglichung , die die Existenz rechtfertigt listOf, mutableListOfund dergleichen.

Miensol
quelle
1
Es gibt also keinen Unterschied.
Sai
2
aund bhaben einen anderen deklarierten Typ - es gibt also einen Unterschied bei der Kompilierung.
Miensol
Es kann alsval b = arrayListOf<String>()
Vlad
8

Wie Sie in Quellen sehen können :

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

Es gibt also keinen Unterschied, nur eine bequeme Methode.

Azizbekian
quelle
Und ich würde "Bequemlichkeit" in Anführungszeichen setzen. Bis MutableList tatsächlich eine andere Implementierung hat, ist die Bereitstellung eines Kernobjekts , das dasselbe wie ein anderes Kernobjekt tut, verwirrend und überhaupt nicht bequem. :(
Mike Williamson