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?


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).


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.