Краткий ответ: массив - это индексированная структура данных, содержащая фиксированное количество элементов; Набор - это неупорядоченная структура данных, содержащая элементы без дубликатов. Оба напечатаны.
Длинный ответ:
В основных терминах массив в Kotlin подобен большинству других языков: структура данных, содержащая значения того же типа. Массивы имеют фиксированную длину, упорядочены и доступны случайным образом по индексу (начиная с 0).
Массив отображается непосредственно в массив Java. Это единственная структура данных, которую предоставляет JVM, кроме Object. (Фактически, типы массивов обрабатываются как специальные подтипы Object.) Они типизированы: вы можете иметь массив примитивного типа (например, массив целых чисел) или ссылочного типа (например, массив чисел). Тип доступен во время выполнения и применяется принудительно. Массивы рассматриваются как ковариантные (что может привести к ошибкам во время выполнения).
В Kotlin / JVM Array
наследует почти все эти функции (кроме ковариации). Используется только для массивов ссылочных типов; Kotlin предоставляет отдельные классы для массивов примитивов (IntArray
& c).
И в основных терминах Set
подобен нескольким другим языкам: неупорядоченная структура данных, содержащая элементы одного типа, ни один из которых не равен.
Set
- это интерфейс, который является частью платформы Java Collections (которая также включает в себя Collection
, List
и Map
). Значение Set
может указывать на любой объект, реализующий этот интерфейс. Это универсальный параметр с одним параметром типа, определяющим, какие значения могут храниться в наборе; это происходит во время компиляции (только).
В Kotlin Set
является ковариантным и только для чтения; есть MutableSet
подинтерфейс, который добавляет методы мутатора. MutableSet
s имеют переменный размер, растут и уменьшаются по мере необходимости.
Существует много различных реализаций интерфейса Set
(и MutableSet
) с различными характеристиками производительности: вставка, удаление и проверка на наличие прересурсов могут быть O (1) или O (n) или чем-то промежуточным и использование памяти и параллелизм также различаются.
Set
s могут быть повторены, но порядок вообще не указан. (Некоторые реализации могут давать гарантии о том, является ли порядок последовательным, и если да, то / как он относится к значениям и / или как они были добавлены.)
Итак, что вы должны использовать? Если вам нужно предотвратить дублирование, то Set
является очевидным выбором. Принимая во внимание, что если вам нужно упорядочить значения, тогда Array
будет более подходящим - хотя, поскольку он не является частью структуры коллекций, он не всегда хорошо работает с другими типами коллекций. (Kotlin предоставляет много методов расширения, чтобы попытаться сгладить разрыв, но все еще есть много угловых случаев.) В общем, обычно лучше вместо этого использовать List
: это дает вам более точный контроль над изменчивостью, избегая некоторых неловких ситуаций (особенно в отношении параметров типа), не фиксирует длину, дает вам гораздо больше методов расширения и на один символ короче!