Різниця між ArrayList <String> () та mutableListOf <String> () у Kotlin


101
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Обидва вони є змінним списком, тоді в чому сенс двох ключових слів mutableListOfчи ArrayList?

чи є якась велика різниця?


6
Ні mutableListOfні ArrayListключові слова в Котлин
Ілля

Відповіді:


141

Єдина різниця між ними полягає в повідомленні про свої наміри.

Коли ви пишете val a = mutableListOf(), ви говорите: "Я хочу змінити список, і я особливо не дбаю про реалізацію". Коли ви пишете, замість цього, val a = ArrayList()ви говорите "я спеціально хочу ArrayList".

На практиці, в поточній реалізації Kotlin, компілюючи до JVM, виклик mutableListOfвидасть ArrayList, і немає різниці в поведінці: як тільки список буде побудований, все буде поводитися однаково.

Тепер, припустимо, що майбутня версія Kotlin змінюється, mutableListOfщоб повернути список іншого типу.

Швидше за все, команда Kotlin внесе цю зміну лише в тому випадку, якщо вважатиме, що нова реалізація працює краще для більшості випадків використання. mutableListOfтоді ви б використовували цей новий внесок списку прозоро, і ви б отримали таку кращу поведінку безкоштовно. Ідіть, mutableListOfякщо це звучить як ваша справа.

З іншого боку, можливо, ви витратили купу часу, обмірковуючи свою проблему, і зрозуміли, що це ArrayList дійсно найкраще підходить для вашої проблеми, і ви не хочете ризикувати переходом до чогось неоптимального. Тоді ви, мабуть, хочете або використовувати ArrayListбезпосередньо, або використовувати arrayListOfзаводську функцію (конкретний ArrayListаналог mutableListOf).


21

mutableListOf<T>()- це вбудований виклик функції, який повертає a MutableList<T>. На сьогоднішній день mutableListOfповертає екземпляр ArrayList.

ArrayList<String>() є викликом конструктора і не може бути вбудованим.

Іншими словами, враховуючи:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a має тип MutableList<String>
  • b має тип ArrayList<String>

Під час виконання обидва aі bбудуть містити екземпляр ArrayList.

Зверніть увагу, що вбудовування особливо корисно в поєднанні з перетворенням типу , що виправдовує існування listOf, mutableListOfтощо.


2
Тож різниці немає.
Сай

2
aі bмають різний оголошений тип - тому є різниця під час компіляції.
miensol

Це можна вписати якval b = arrayListOf<String>()
Влад

8

Як ви можете бачити в джерелах :

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

Отже, різниці немає, лише зручний метод.


1
І я б поставив "зручність" у лапки. Поки MutableList насправді не має іншої реалізації, надання основного об'єкта, який робить те саме, що і інший основний об'єкт, викликає заплутаність, і зовсім не зручність. :(
Mike Williamson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.