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