В чем разница List и MutableList, их преимущества и недостатки
Что проверяют
Понимаете ли вы, что List в Kotlin это интерфейс только для чтения, а не неизменяемая коллекция. На Android следом почти всегда спрашивают, как это связано со StateFlow, LiveData и Compose: почему экран не обновился после add.
Как отвечать
Оба интерфейса из kotlin.collections, и на JVM оба отображаются на java.util.List. Разница только в том, какие методы видит компилятор:
List<out E>: чтение,get,size, итерация. Ковариантен, поэтомуList<String>можно передать туда, где ждутList<Any>;MutableList<E>: наследникListсadd,remove,set,clear. Инвариантен, иначе в список строк можно было бы положить число.
Тип List запрещает менять коллекцию только через эту ссылку. Владелец может отдать свой MutableList наружу как List и продолжать его менять, а потребитель увидит изменения. Настоящую неизменяемость дают ImmutableList и PersistentList из kotlinx.collections.immutable.
Плюсы List: API явно говорит, что потребитель данные не меняет, меньше случайных побочных эффектов, ковариантность. Плюсы MutableList: изменение на месте без копирования, удобно внутри функции или класса. Минусы зеркальные: List на каждое изменение требует новой копии, а MutableList, отданный наружу, может поменять кто угодно.
Практическое правило для Android: из ViewModel и репозитория наружу отдавать List, внутри класса держать MutableList, а в состояние экрана класть новый экземпляр.
Где спотыкаются
Мутируют список внутри StateFlow или LiveData и присваивают ту же ссылку. StateFlow сравнивает значения через equals, для того же объекта это true, и эмита не будет. Правильно: _state.update { it + item }.
В Compose держат mutableStateOf(mutableListOf()) и вызывают add. Снапшот-система не видит изменений внутри обычного списка, нужен mutableStateListOf() или новый список.
Передают в ListAdapter.submitList тот же изменённый экземпляр. AsyncListDiffer видит ту же ссылку и ничего не делает, RecyclerView не обновляется. Отдельно Java-интероп: Java-код, получивший ваш List, спокойно вызовет add, для него это обычный java.util.List.