Комментарии (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;
}
Сравнение в таблице
| Свойство | List | Set | Map |
|---|---|---|---|
| Упорядоченность | Да | Нет | Нет |
| Доступ по индексу | Да [0] | Нет | По ключу |
| Дубликаты | Разрешены | Запрещены | Ключи уникальны |
| Быстрый поиск | O(n) | O(1) | O(1) |
| Основное использование | Упорядоченные данные | Уникальные значения | Связи ключ-значение |
Выбор коллекции
Используй List когда:
- Нужен определённый порядок элементов
- Нужно часто обращаться по индексу
- Допускаются дубликаты
Используй Set когда:
- Нужны только уникальные значения
- Порядок не важен
- Нужны операции над множествами
- Нужна быстрая проверка наличия элемента
Используй Map когда:
- Нужны связи ключ-значение
- Нужно быстро найти значение по ключу
- Ключи имеют смысловое значение
Примеры из реальной жизни
// Список сообщений в чате - нужен порядок
List<Message> messages = [];
// Уникальные ID пользователей онлайн
Set<String> onlineUsers = {};
// Отображение ID пользователя на его профиль
Map<String, UserProfile> userProfiles = {};
Каждая коллекция решает свою задачу — выбирай правильный инструмент для своей проблемы.