Какие методы существуют у коллекций
Что проверяют
Насколько уверенно вы работаете с коллекциями в Kotlin, основном языке Android-разработки, и понимаете ли цену операций. Базовый интерфейс Collection из Java знают все, поэтому следом спрашивают про изменяемость, ленивые Sequence и сложность поиска.
Как отвечать
Начните с иерархии: в Kotlin List, Set и Map дают только чтение, а MutableList, MutableSet и MutableMap добавляют add, remove, clear. На JVM под ними обычные ArrayList, LinkedHashSet и LinkedHashMap. Дальше методы по группам:
- базовые:
size,isEmpty(),contains(),indexOf(); у изменяемыхadd,addAll,remove,removeAll { },retainAll { }; - преобразования:
map,mapNotNull,flatMap,associateBy,groupBy,zip; - фильтрация и поиск:
filter,partition,first,firstOrNull,find,any,all,none; - агрегация:
sumOf,count,fold,reduce,maxByOrNull; - сортировка и разбиение:
sortedBy,sortedWith(compareBy(...)),distinctBy,chunked,windowed.
Про производительность: каждая операция в цепочке над List создаёт новый промежуточный список. Для больших данных и длинных цепочек есть asSequence(): элементы проходят цепочку по одному, промежуточных списков нет. contains у списка стоит O(n), у HashSet в среднем O(1).
Специфика Android: SparseArray и ArrayMap экономят память на небольших картах, SparseArray ещё и избегает упаковки ключей Int. Если передать в submitList у ListAdapter тот же экземпляр списка, изменённый на месте, адаптер решит, что ничего не поменялось. Передавайте новый список.
Где спотыкаются
Путают «только для чтения» с неизменяемостью. List лишь не даёт методов записи, а под ним может лежать ArrayList, который кто-то меняет. Для настоящей неизменяемости есть kotlinx.collections.immutable.
Удаляют элементы внутри forEach и получают ConcurrentModificationException. Правильно removeAll { } или итератор с remove().
Вызывают first() на возможно пустой коллекции. Это NoSuchElementException, безопасный вариант firstOrNull().