В чем разница между множеством (Set) и массивом (List) в Dart?

«В чем разница между множеством (Set) и массивом (List) в Dart?» — вопрос из категории Алгоритмы и структуры данных, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

List и Set — это две основные коллекции в Dart с фундаментальными различиями в семантике и производительности.

List (Список/Массив)

  • Упорядоченная коллекция.
  • Допускает дубликаты элементов.
  • Доступ к элементам по индексу.
    List<String> cities = ['Москва', 'Санкт-Петербург', 'Москва'];
    print(cities); // [Москва, Санкт-Петербург, Москва]
    print(cities[1]); // Санкт-Петербург

Set (Множество)

  • Неупорядоченная коллекция (порядок не гарантируется, если это не LinkedHashSet).
  • Содержит только уникальные элементы. Дубликаты автоматически игнорируются.
  • Быстрая проверка на наличие элемента (contains).
    Set<String> uniqueCities = {'Москва', 'Санкт-Петербург', 'Москва'};
    print(uniqueCities); // {Москва, Санкт-Петербург}
    print(uniqueCities.contains('Москва')); // true (выполняется быстро)
Ключевые отличия и выбор: Критерий List Set
Порядок Сохраняется Не гарантирован
Дубликаты Разрешены Запрещены
Производительность contains() O(n) (медленно) O(1) (быстро)
Типичный use-case Лента сообщений, элементы UI в определённом порядке, очередь задач. Хранение уникальных ID, тегов, проверка принадлежности (например, список избранного).

Пример в контексте Flutter:

// List: для отображения упорядоченного списка виджетов
List<Widget> widgetList = [Text('A'), Text('B'), Text('A')];

// Set: для хранения выбранных уникальных элементов в фильтре
Set<int> selectedFilterIds = {1, 5, 1}; // Фактически {1, 5}
if (selectedFilterIds.contains(5)) { ... } // Быстрая проверка