В чем разница между List, Set и Map в Dart?

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

Ответ

Это три фундаментальные интерфейса коллекций в Dart с разной семантикой и назначением.

1. List<E> (Список)

  • Упорядоченная коллекция с доступом по индексу.
  • Допускает дубликаты элементов.
  • Основные операции: доступ по индексу list[i], добавление add(), обход в цикле for.
    List<String> colors = ['red', 'green', 'blue', 'red'];
    print(colors[0]); // 'red'
    print(colors.length); // 4 (два 'red')

2. Set<E> (Множество)

  • Неупорядоченная (если не LinkedHashSet) коллекция уникальных элементов.
  • Нет доступа по индексу. Быстрая проверка на наличие элемента (O(1) для HashSet).
  • Основная операция: проверка contains().
    Set<String> uniqueColors = {'red', 'green', 'blue', 'red'};
    print(uniqueColors); // {red, green, blue} (дубль удален)
    print(uniqueColors.contains('green')); // true

3. Map<K, V> (Ассоциативный массив)

  • Коллекция пар ключ-значение. Ключи уникальны.
  • Доступ к значению осуществляется по ключу, а не по индексу.
  • Основная операция: доступ map[key].
    Map<String, int> inventory = {'apples': 5, 'oranges': 12};
    print(inventory['apples']); // 5
    inventory['bananas'] = 7; // Добавляем новую пару

Итог:

  • Используй List, когда важен порядок и возможны повторы (например, список сообщений в чате).
  • Используй Set, когда важна уникальность и быстрый поиск (например, кэш просмотренных ID).
  • Используй Map, когда нужно связать данные по уникальному идентификатору (например, Map<UserId, UserProfile>).