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

В чем разница между словарем и коллекцией?

1.3 Junior🔥 111 комментариев
#Коллекции#Основы Java

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

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

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

Разница между словарем и коллекцией в Java

Это вопрос о фундаментальных интерфейсах Java Collections Framework. Словарь (Map) и коллекция (Collection) — это две отдельные иерархии, несмотря на то, что оба хранят данные.

Коллекция (Collection)

Коллекция — это интерфейс для хранения группы объектов в виде одного типа данных. Это упорядоченное или неупорядоченное множество элементов.

// Иерархия Collection
public interface Collection<E> extends Iterable<E> {
    boolean add(E e);
    boolean remove(Object o);
    boolean contains(Object o);
    int size();
    Iterator<E> iterator();
    // ... и другие методы
}

// Основные реализации
List<String> list = new ArrayList<>();      // Упорядоченная
Set<String> set = new HashSet<>();          // Уникальные
Queue<String> queue = new LinkedList<>();   // FIFO

Типы коллекций:

  1. List — упорядоченная коллекция с индексами
List<String> fruits = Arrays.asList("apple", "banana", "orange");
fruits.get(0);           // apple
fruits.indexOf("banana"); // 1
fruits.set(1, "grape");  // Замена
  1. Set — неупорядоченная коллекция уникальных элементов
Set<String> uniqueColors = new HashSet<>(Arrays.asList(
    "red", "green", "blue", "red"
));
// Размер = 3 (red добавлен только один раз)
  1. Queue — коллекция с правилами FIFO (First In, First Out)
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);   // Добавить
queue.offer(2);
queue.poll();     // Удалить первый (1)

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

  • Хранит отдельные элементы
  • Может содержать дубликаты (кроме Set)
  • Упорядоченность зависит от типа
  • Основан на итерировании
  • Один элемент — один объект

Словарь/Карта (Map)

Словарь — это интерфейс для хранения пар ключ-значение. Это ассоциативный массив, где каждому уникальному ключу соответствует значение.

// Определение Map
public interface Map<K, V> {
    V put(K key, V value);
    V get(Object key);
    V remove(Object key);
    boolean containsKey(Object key);
    Set<K> keySet();
    Collection<V> values();
    Set<Map.Entry<K, V>> entrySet();
    // ... и другие методы
}

// Основные реализации
Map<String, Integer> ages = new HashMap<>();
Map<String, String> sortedAges = new TreeMap<>();
Map<String, Integer> linkedAges = new LinkedHashMap<>();

Примеры использования Map:

// Создание и добавление
Map<String, String> capitals = new HashMap<>();
capitals.put("USA", "Washington");
capitals.put("France", "Paris");
capitals.put("Japan", "Tokyo");

// Получение значения
String capital = capitals.get("USA");  // Washington

// Проверка наличия
if (capitals.containsKey("Germany")) {
    System.out.println("Found");
}

// Итерирование
for (Map.Entry<String, String> entry : capitals.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

// Или более просто
for (String key : capitals.keySet()) {
    System.out.println(key + " -> " + capitals.get(key));
}

Типы Map:

  1. HashMap — быстрая, неупорядоченная
Map<Integer, String> map = new HashMap<>();
// O(1) для get/put
  1. TreeMap — упорядоченная по ключам, медленнее
Map<String, Integer> sorted = new TreeMap<>();
// O(log n) для операций
  1. LinkedHashMap — сохраняет порядок вставки
Map<String, String> ordered = new LinkedHashMap<>();
// Итерирует в порядке добавления

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

  • Хранит пары ключ-значение
  • Ключи должны быть уникальными
  • Значения могут быть одинаковыми
  • Быстрый поиск по ключу
  • Не наследует Collection

Сравнение

АспектCollectionMap
ЭлементыОдиночныеПары ключ-значение
УникальностьЗависит от типаКлючи уникальны
ПоискПо значениюПо ключу (быстро)
СтруктураList, Set, QueueHashMap, TreeMap
НаследованиеОбщий интерфейсОтдельная иерархия
ИтерированиеПрямоеЧерез entrySet()

Иерархия в Java

Iterable
  |
  Collection
    |
    +-- List (ArrayList, LinkedList)
    +-- Set (HashSet, TreeSet)
    +-- Queue (LinkedList, PriorityQueue)

Map (НЕ наследует Collection)
  |
  +-- HashMap
  +-- TreeMap
  +-- LinkedHashMap

Практические примеры

Использование Collection (List):

// Задача: хранить список оценок студента
List<Integer> grades = new ArrayList<>();
grades.add(85);
grades.add(90);
grades.add(78);

// Вычисление среднего
int avg = grades.stream().mapToInt(Integer::intValue).sum() / grades.size();

Использование Collection (Set):

// Задача: найти уникальные слова в тексте
String text = "hello world hello java";
Set<String> uniqueWords = new HashSet<>(Arrays.asList(
    text.split(" ")
));
// Результат: {hello, world, java}

Использование Map:

// Задача: подсчитать частоту слов
Map<String, Integer> wordCount = new HashMap<>();
for (String word : text.split(" ")) {
    wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
// {hello=2, world=1, java=1}

Производительность

Collection (ArrayList):

  • get(index): O(1)
  • add: O(1) amortized
  • remove: O(n)

Collection (HashSet):

  • add: O(1)
  • contains: O(1)
  • remove: O(1)

Map (HashMap):

  • get(key): O(1)
  • put: O(1)
  • remove: O(1)

Map (TreeMap):

  • get(key): O(log n)
  • put: O(log n)
  • remove: O(log n)

Когда использовать

Collection:

  • Нужна упорядоченность элементов (List)
  • Нужны только уникальные элементы (Set)
  • Нужна очередь операций (Queue)
  • Данные представляют собой "список чего-то"

Map:

  • Нужна быстрая доступ по ключу
  • Данные парные (ключ-значение)
  • Нужно кэшировать данные
  • Нужен словарь или индекс

Итог

Коллекция (Collection) — это контейнер для отдельных элементов, где элементы хранятся как множество однотипных объектов. Map — это контейнер для пар ключ-значение, оптимизированный для быстрого поиска по ключу. Хотя оба используют Collection Framework в Java, они решают разные задачи и имеют разные API.