Какие коллекции существуют в Kotlin и каковы их особенности
Что проверяют
Понимаете ли вы разделение на изменяемые и неизменяемые интерфейсы и знаете ли, что за ними стоят обычные коллекции Java.
Как отвечать
В Kotlin у коллекций два интерфейса: только для чтения (List, Set, Map) и изменяемый (MutableList, MutableSet, MutableMap). Создаются через listOf и mutableListOf.
Важная честная оговорка: List это не гарантия неизменности, а отсутствие методов изменения. Под ним лежит тот же ArrayList, и если ссылка на изменяемый вариант есть у кого-то ещё, содержимое поменяется. Настоящая неизменяемая коллекция это kotlinx.collections.immutable или копия.
Реализации те же, что в Java: ArrayList, LinkedHashSet, LinkedHashMap по умолчанию, что даёт предсказуемый порядок обхода у множества и карты, в отличие от HashSet и HashMap.
Из полезного, что отличает работу с ними от Java:
- богатый набор функций на коллекциях:
map,filter,groupBy,associateBy,partition,sumOf,windowed,zip; - последовательности (
asSequence): ленивые вычисления, элемент проходит всю цепочку целиком. На длинных цепочках и больших коллекциях экономят промежуточные списки, на коротких проигрывают из-за накладных расходов; Arrayэто отдельный тип, а не список, и для примитивов естьIntArrayбез упаковки.
Где спотыкаются
Считают listOf неизменяемой коллекцией в строгом смысле.
Не знают про последовательности и строят пять промежуточных списков в цепочке.
Путают Array и List.
Забывают, что порядок в mapOf сохраняется, и полагаются на это, переходя на HashMap.