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

Что такое Коллекции?

1.3 Junior🔥 211 комментариев
#Коллекции

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

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

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

Что такое Коллекции в Java

Коллекции (Collections) — это контейнеры для хранения и управления группами объектов. Это фундаментальная часть Java API, предоставляющая стандартизированные структуры данных для работы с наборами элементов.

Основные иерархии

Вся Java Collections Framework строится на двух основных интерфейсах:

Collection

Базовый интерфейс для всех коллекций:

  • add(), remove(), contains() — основные операции
  • size(), isEmpty() — проверка состояния
  • iterator() — обход элементов

Map

Отдельная иерархия для хранения пар ключ-значение (не наследуется от Collection).

Основные типы коллекций

List — упорядоченная коллекция (позволяет дубликаты):

List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();
List<String> vector = new Vector<>(); // legacy, синхронизирован

Set — неупорядоченная коллекция без дубликатов:

Set<String> hashSet = new HashSet<>();
Set<String> treeSet = new TreeSet<>(); // отсортирована
Set<String> linkedHashSet = new LinkedHashSet<>(); // порядок вставки

Queue — очередь (FIFO):

Queue<String> queue = new LinkedList<>();
Queue<String> priorityQueue = new PriorityQueue<>(); // приоритетная
Deque<String> deque = new LinkedList<>(); // двусторонняя очередь

Map — пары ключ-значение:

Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();

Основные операции и производительность

СтруктураДоступВставкаУдалениеПоиск
ArrayListO(1)O(n)O(n)O(n)
LinkedListO(n)O(1)O(1)O(n)
HashSetO(1)O(1)O(1)
TreeSetO(log n)O(log n)O(log n)
HashMapO(1)O(1)O(1)

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

public class CollectionsExample {
    public static void main(String[] args) {
        // List
        List<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(3);
        numbers.add(8);
        System.out.println(numbers.get(1)); // 3

        // Set
        Set<String> uniqueNames = new HashSet<>();
        uniqueNames.add("Alice");
        uniqueNames.add("Bob");
        uniqueNames.add("Alice"); // дубликат не добавится

        // Map
        Map<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 25);
        ages.put("Bob", 30);
        System.out.println(ages.get("Alice")); // 25

        // Итерация
        for (String name : uniqueNames) {
            System.out.println(name);
        }

        // Stream API
        numbers.stream()
               .filter(n -> n > 3)
               .map(n -> n * 2)
               .forEach(System.out::println);
    }
}

Выбор правильной коллекции

  1. Нужно ли сохранять порядок? → List
  2. Нужны уникальные элементы? → Set
  3. Нужны пары ключ-значение? → Map
  4. Часто удаляете элементы в начале/конце? → LinkedList или Deque
  5. Нужна быстрая вставка/удаление в начале? → LinkedList
  6. Нужна сортировка? → TreeSet или TreeMap
  7. Нужна потокобезопасность? → Collections.synchronizedList() или ConcurrentHashMap

Важные особенности

  • Null элементы: Map и List допускают null, HashSet допускает одного null, TreeSet — нет (сравнение)
  • Fail-fast итератор: если коллекция изменилась во время итерации, будет выброшено ConcurrentModificationException
  • equals() и hashCode(): для использования в Set и как ключ в Map нужно правильно реализовать эти методы