Ani słowa kluczowe mutableListOfnie ArrayListsą w Kotlin
Ilya
Odpowiedzi:
142
Jedyna różnica między nimi polega na komunikowaniu swoich zamiarów.
Pisząc val a = mutableListOf(), mówisz: „Chcę mieć zmienną listę i nie obchodzi mnie implementacja”. Zamiast tego, val a = ArrayList()pisząc, mówisz „Ja konkretnie chcę ArrayList”.
W praktyce, w obecnej implementacji Kotlina kompilującego do JVM, wywołanie mutableListOfwygeneruje znak ArrayListi nie ma różnicy w zachowaniu: po zbudowaniu listy wszystko będzie zachowywać się tak samo.
Teraz powiedzmy, że przyszła wersja Kotlina zmieni się, mutableListOfaby zwrócić inny typ listy.
Bardziej prawdopodobne jest, że zespół Kotlin dokonałby tej zmiany tylko wtedy, gdy uzna, że nowa implementacja działa lepiej w większości przypadków użycia. mutableListOfsprawiłby, że korzystasz z tej nowej implementacji listy w sposób przejrzysty, a lepsze zachowanie uzyskasz za darmo. Idź z, mutableListOfjeśli to brzmi jak twoja sprawa.
Z drugiej strony, być może spędziłeś trochę czasu na myśleniu o swoim problemie i doszedłeś do wniosku, że ArrayListnaprawdę najlepiej pasuje do twojego problemu i nie chcesz ryzykować przeniesienia się do czegoś nieoptymalnego. Wtedy prawdopodobnie będziesz chciał użyć ArrayListbezpośrednio lub użyć arrayListOffunkcji fabrycznej ( ArrayListspecyficznego analogu do mutableListOf).
I dodałbym „wygodę” w cudzysłowie. Dopóki MutableList faktycznie nie ma innej implementacji, zapewnienie podstawowego obiektu, który robi to samo, co inny obiekt podstawowy, jest mylące i wcale nie jest wygodne. :(
mutableListOf
nieArrayList
są w KotlinOdpowiedzi:
Jedyna różnica między nimi polega na komunikowaniu swoich zamiarów.
Pisząc
val a = mutableListOf()
, mówisz: „Chcę mieć zmienną listę i nie obchodzi mnie implementacja”. Zamiast tego,val a = ArrayList()
pisząc, mówisz „Ja konkretnie chcęArrayList
”.W praktyce, w obecnej implementacji Kotlina kompilującego do JVM, wywołanie
mutableListOf
wygeneruje znakArrayList
i nie ma różnicy w zachowaniu: po zbudowaniu listy wszystko będzie zachowywać się tak samo.Teraz powiedzmy, że przyszła wersja Kotlina zmieni się,
mutableListOf
aby zwrócić inny typ listy.Bardziej prawdopodobne jest, że zespół Kotlin dokonałby tej zmiany tylko wtedy, gdy uzna, że nowa implementacja działa lepiej w większości przypadków użycia.
mutableListOf
sprawiłby, że korzystasz z tej nowej implementacji listy w sposób przejrzysty, a lepsze zachowanie uzyskasz za darmo. Idź z,mutableListOf
jeśli to brzmi jak twoja sprawa.Z drugiej strony, być może spędziłeś trochę czasu na myśleniu o swoim problemie i doszedłeś do wniosku, że
ArrayList
naprawdę najlepiej pasuje do twojego problemu i nie chcesz ryzykować przeniesienia się do czegoś nieoptymalnego. Wtedy prawdopodobnie będziesz chciał użyćArrayList
bezpośrednio lub użyćarrayListOf
funkcji fabrycznej (ArrayList
specyficznego analogu domutableListOf
).źródło
mutableListOf<T>()
jest wywołaniem funkcji wbudowanej, które zwraca plikMutableList<T>
. Na dzień dzisiejszymutableListOf
zwraca wystąpienieArrayList
.ArrayList<String>()
jest wywołaniem konstruktora i nie można go wstawić.Innymi słowy, biorąc pod uwagę:
val a = mutableListOf<String>() val b = ArrayList<String>()
a
jest typuMutableList<String>
b
jest typuArrayList<String>
W czasie wykonywania zarówno
a
ib
będzie przechowywać wystąpienieArrayList
.Należy zauważyć, że inline jest szczególnie użyteczny w połączeniu z typu reifikację , co uzasadnia istnienie
listOf
,mutableListOf
i tym podobne.źródło
a
ib
mają inny zadeklarowany typ - więc istnieje różnica w czasie kompilacji.val b = arrayListOf<String>()
Jak widać w źródłach :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Więc nie ma różnicy, tylko wygodna metoda.
źródło