Różnica między ArrayList <String> () a mutableListOf <String> () w Kotlinie

102
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Obie są zmiennymi listami, więc jaki jest sens dwóch słów kluczowych mutableListOflub ArrayList?

czy jest jakaś poważna różnica?

Sai
źródło
6
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 ArrayList naprawdę 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).

pdpi
źródło
21

mutableListOf<T>()jest wywołaniem funkcji wbudowanej, które zwraca plik MutableList<T>. Na dzień dzisiejszy mutableListOfzwraca wystąpienie ArrayList.

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 typu MutableList<String>
  • b jest typu ArrayList<String>

W czasie wykonywania zarówno ai bbędzie przechowywać wystąpienie ArrayList.

Należy zauważyć, że inline jest szczególnie użyteczny w połączeniu z typu reifikację , co uzasadnia istnienie listOf, mutableListOfi tym podobne.

miensol
źródło
2
Więc nie ma różnicy.
Sai
2
ai bmają inny zadeklarowany typ - więc istnieje różnica w czasie kompilacji.
miensol
Można go wstawić jakoval b = arrayListOf<String>()
Vlad
8

Jak widać w źródłach :

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

Więc nie ma różnicy, tylko wygodna metoda.

azizbekian
źródło
1
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. :(
Mike Williamson