Разница между ArrayList <String> () и mutableListOf <String> () в Kotlin

102
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

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

или есть большая разница?

Сай
источник
6
Ни mutableListOfи ArrayListнет ключевых слов в Котлине
Илья

Ответы:

144

Единственное различие между ними - передача вашего намерения.

Когда вы пишете val a = mutableListOf(), вы говорите: «Мне нужен изменяемый список, и меня не особо волнует реализация». Когда вы вместо этого пишете, val a = ArrayList()вы говорите: «Я специально хочу ArrayList».

На практике в текущей реализации компиляции Kotlin в JVM при вызове mutableListOfбудет генерироваться ArrayList, и нет никакой разницы в поведении: после того, как список построен, все будет вести себя так же.

Теперь предположим, что будущая версия Kotlin изменится mutableListOfи вернет список другого типа.

Скорее всего, команда Kotlin внесет это изменение только в том случае, если посчитает, что новая реализация лучше работает для большинства случаев использования. mutableListOfтогда вы могли бы прозрачно использовать эту новую реализацию списка и получить это лучшее поведение бесплатно. Продолжайте, mutableListOfесли это похоже на ваш случай.

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

pdpi
источник
21

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и тому подобное.

Минсол
источник
2
Так что разницы нет.
Сай
2
aи bимеют другой объявленный тип - поэтому есть разница во время компиляции.
miensol
Это может быть вставлено какval b = arrayListOf<String>()
Vlad
8

Как вы можете видеть в источниках :

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

Так что разницы нет, просто удобный способ.

азизбекский
источник
1
А «удобство» я бы заключил в кавычки. Пока MutableList не имеет другой реализации, предоставление основного объекта, который выполняет то же самое, что и другой основной объект, сбивает с толку и совсем не удобно. :(
Майк Уильямсон