← Назад к вопросам

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

1.0 Junior🔥 161 комментариев
#Dart

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между List, Set и Map в Dart

List, Set и Map — это три основные коллекции в Dart, каждая из которых служит разным целям и имеет свои особенности.

List (Список)

List — это упорядоченная коллекция элементов, где каждый элемент имеет индекс.

// Создание List
List<int> numbers = [1, 2, 3, 4, 5];
var fruits = ['apple', 'banana', 'orange'];
List<String> emptyList = [];
var dynamicList = <dynamic>[1, 'two', 3.0, true];

// Доступ к элементам по индексу
print(numbers[0]); // 1
print(numbers[2]); // 3

// Методы List
numbers.add(6); // Добавить элемент в конец
numbers.insert(0, 0); // Вставить на позицию
numbers.remove(3); // Удалить первый элемент со значением 3
numbers.removeAt(0); // Удалить по индексу
print(numbers.length); // Количество элементов
print(numbers.first); // Первый элемент
print(numbers.last); // Последний элемент
print(numbers.contains(4)); // Проверка наличия

// Итерация
for (var num in numbers) {
  print(num);
}

numbers.forEach((num) => print(num));

// Трансформация
var doubled = numbers.map((x) => x * 2).toList();
var filtered = numbers.where((x) => x > 3).toList();

Характеристики List:

  • Упорядочена — элементы в определённом порядке
  • Доступ по индексу — O(1) за константное время
  • Может содержать дубликаты — [1, 1, 2, 2, 3]
  • Динамический размер — можно добавлять/удалять элементы
  • Производительность — быстро для чтения и доступа по индексу
// Практический пример
List<String> shoppingList = ['milk', 'bread', 'eggs', 'milk'];
print(shoppingList.length); // 4 - дубликаты сохранены
shoppingList.remove('milk'); // Удаляет первое 'milk'
print(shoppingList); // [bread, eggs, milk]

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

Set — это неупорядоченная коллекция уникальных элементов.

// Создание Set
Set<int> numbers = {1, 2, 3, 4, 5};
var fruits = {'apple', 'banana', 'orange'};
Set<String> emptySet = {};
var dynamicSet = <dynamic>{1, 'two', 3.0, true};

// Дубликаты автоматически удаляются
var mixedSet = {1, 2, 2, 3, 3, 3};
print(mixedSet); // {1, 2, 3}

// Методы Set
numbers.add(6);
numbers.addAll([7, 8, 9]);
numbers.remove(3);
print(numbers.length);
print(numbers.contains(4)); // true

// Операции теории множеств
var setA = {1, 2, 3};
var setB = {2, 3, 4};

var union = setA.union(setB); // {1, 2, 3, 4}
var intersection = setA.intersection(setB); // {2, 3}
var difference = setA.difference(setB); // {1}

print(setA.containsAll(setB)); // false
print(setB.containsAll({2, 3})); // true

// Итерация (порядок не гарантирован)
for (var num in numbers) {
  print(num);
}

Характеристики Set:

  • Неупорядочено — порядок элементов не гарантирован
  • Уникальные элементы — дубликаты автоматически удаляются
  • Нет доступа по индексу — нельзя использовать [0]
  • Быстрая проверка наличия — O(1) в среднем
  • Операции над множествами — union, intersection, difference
// Практический пример - удаление дубликатов
List<int> duplicates = [1, 2, 2, 3, 3, 3, 4, 5];
var uniqueNumbers = duplicates.toSet(); // {1, 2, 3, 4, 5}
var listAgain = uniqueNumbers.toList(); // [1, 2, 3, 4, 5]

Map (Словарь)

Map — это коллекция пар "ключ-значение", где каждый ключ уникален и отображается на значение.

// Создание Map
Map<String, int> ages = {'Alice': 25, 'Bob': 30, 'Charlie': 35};
var person = {'name': 'John', 'age': 30, 'city': 'NYC'};
Map<String, List<int>> groups = {
  'team1': [1, 2, 3],
  'team2': [4, 5, 6],
};

// Доступ к элементам
print(ages['Alice']); // 25
print(ages['David']); // null
print(ages['David'] ?? 'unknown'); // unknown

// Методы Map
ages['David'] = 28; // Добавить или обновить
ages.update('Alice', (value) => value + 1); // Обновить с функцией
ages.remove('Charlie');
print(ages.length);
print(ages.containsKey('Bob')); // true
print(ages.containsValue(30)); // true

// Получить все ключи и значения
print(ages.keys); // (Alice, Bob, David)
print(ages.values); // (26, 30, 28)

// Итерация
ages.forEach((key, value) {
  print('$key: $value');
});

for (var entry in ages.entries) {
  print('${entry.key}: ${entry.value}');
}

// Трансформация
var doubles = ages.map((key, value) => MapEntry(key, value * 2));
var filtered = Map.fromEntries(
  ages.entries.where((e) => e.value > 25)
);

Характеристики Map:

  • Пары ключ-значение — каждому ключу соответствует значение
  • Уникальные ключи — ключи не могут повторяться
  • Быстрый поиск — O(1) доступ по ключу в среднем
  • Динамический — можно добавлять/удалять пары
  • Гибкие типы — ключи и значения могут быть разными типами
// Практический пример - кэширование
Map<String, Future<UserData>> userCache = {};

Future<UserData> getUser(String id) async {
  if (userCache.containsKey(id)) {
    return userCache[id]!;
  }
  
  final future = fetchUserFromApi(id);
  userCache[id] = future;
  return future;
}

Сравнение в таблице

СвойствоListSetMap
УпорядоченностьДаНетНет
Доступ по индексуДа [0]НетПо ключу
ДубликатыРазрешеныЗапрещеныКлючи уникальны
Быстрый поискO(n)O(1)O(1)
Основное использованиеУпорядоченные данныеУникальные значенияСвязи ключ-значение

Выбор коллекции

Используй List когда:

  • Нужен определённый порядок элементов
  • Нужно часто обращаться по индексу
  • Допускаются дубликаты

Используй Set когда:

  • Нужны только уникальные значения
  • Порядок не важен
  • Нужны операции над множествами
  • Нужна быстрая проверка наличия элемента

Используй Map когда:

  • Нужны связи ключ-значение
  • Нужно быстро найти значение по ключу
  • Ключи имеют смысловое значение

Примеры из реальной жизни

// Список сообщений в чате - нужен порядок
List<Message> messages = [];

// Уникальные ID пользователей онлайн
Set<String> onlineUsers = {};

// Отображение ID пользователя на его профиль
Map<String, UserProfile> userProfiles = {};

Каждая коллекция решает свою задачу — выбирай правильный инструмент для своей проблемы.