private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Оба являются изменяемым списком, тогда какой смысл в двух ключевых словах mutableListOf
или ArrayList
?
или есть большая разница?
Ответы:
Единственное различие между ними - передача вашего намерения.
Когда вы пишете val a = mutableListOf()
, вы говорите: «Мне нужен изменяемый список, и меня не особо волнует реализация». Когда вы вместо этого пишете, val a = ArrayList()
вы говорите: «Я специально хочу ArrayList
».
На практике в текущей реализации компиляции Kotlin в JVM при вызове mutableListOf
будет генерироваться ArrayList
, и нет никакой разницы в поведении: после того, как список построен, все будет вести себя так же.
Теперь предположим, что будущая версия Kotlin изменится mutableListOf
и вернет список другого типа.
Скорее всего, команда Kotlin внесет это изменение только в том случае, если посчитает, что новая реализация лучше работает для большинства случаев использования. mutableListOf
тогда вы могли бы прозрачно использовать эту новую реализацию списка и получить это лучшее поведение бесплатно. Продолжайте, mutableListOf
если это похоже на ваш случай.
С другой стороны, возможно, вы потратили кучу времени, размышляя о своей проблеме, и посчитали, что это ArrayList
действительно лучше всего подходит для вашей проблемы, и вы не хотите рисковать, чтобы перейти к чему-то неоптимальному. Тогда вы, вероятно, захотите либо использовать ArrayList
напрямую, либо использовать arrayListOf
фабричную функцию ( ArrayList
специфический аналог mutableListOf
).
mutableListOf<T>()
- это встроенный вызов функции, возвращающий
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
и тому подобное.
a
и b
имеют другой объявленный тип - поэтому есть разница во время компиляции.
val b = arrayListOf<String>()
Как вы можете видеть в источниках :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Так что разницы нет, просто удобный способ.
mutableListOf
иArrayList
нет ключевых слов в Котлине