Раздел 4 · 30 вопросов

Коллекции

30 вопросов и ответов в разделе Коллекции.

Russian Коллекции Исходный Markdown
Версии по языкам: English Russian Ukrainian

Вопросы этого раздела

  1. Какие основные интерфейсы Collection Framework?
  2. В чём разница между List, Set и Queue?
  3. В чём разница между ArrayList и LinkedList?
  4. Когда использовать ArrayList, а когда LinkedList?
  5. Какова временная сложность операций в ArrayList?
  6. Какова временная сложность операций в LinkedList?
  7. Что такое Vector и чем он отличается от ArrayList?
  8. Что такое Stack?
  9. Что такое Queue и какие реализации существуют?
  10. Что такое Deque?
  11. В чём разница между HashSet, LinkedHashSet и TreeSet?
  12. Как работает HashSet внутри?
  13. Что такое TreeSet и как он работает?
  14. Что такое Map и какие реализации существуют?
  15. В чём разница между HashMap, LinkedHashMap и TreeMap?
  16. Когда использовать TreeMap?
  17. Что такое WeakHashMap?
  18. Что такое ConcurrentHashMap?
  19. Как ConcurrentHashMap обеспечивает thread-safety?
  20. Что такое CopyOnWriteArrayList?
  21. Когда использовать synchronized collections?
  22. Как получить synchronized коллекцию?
  23. Что такое Collections.unmodifiableList()?
  24. Как работает Collections.unmodifiableList() внутри
  25. В чём разница между Iterator и ListIterator?
  26. Что такое fail-fast и fail-safe итераторы?
  27. Что такое ConcurrentModificationException?
  28. Как правильно удалять элементы во время итерации?
  29. Что такое Comparable и Comparator?
  30. Какие операции поддерживает интерфейс Collection?

Навигатор по разделу

30 вопросов для подготовки к собеседованию на Middle Java Developer.


📋 Все вопросы

# Вопрос Уровень сложности
1 Какие основные интерфейсы Collection Framework ⭐⭐
2 В чём разница между List, Set и Queue
3 В чём разница между ArrayList и LinkedList ⭐⭐
4 Когда использовать ArrayList, а когда LinkedList ⭐⭐
5 Какова временная сложность операций в ArrayList ⭐⭐⭐
6 Какова временная сложность операций в LinkedList ⭐⭐⭐
7 Что такое Vector и чем он отличается от ArrayList
8 Что такое Stack
9 Что такое Queue и какие реализации существуют ⭐⭐
10 Что такое Deque ⭐⭐
11 В чём разница между HashSet, LinkedHashSet и TreeSet ⭐⭐
12 Как работает HashSet внутри ⭐⭐⭐
13 Что такое TreeSet и как он работает ⭐⭐
14 Что такое Map и какие реализации существуют ⭐⭐
15 В чём разница между HashMap, LinkedHashMap и TreeMap ⭐⭐
16 Когда использовать TreeMap ⭐⭐⭐
17 Что такое WeakHashMap ⭐⭐⭐
18 Что такое ConcurrentHashMap ⭐⭐⭐
19 Как ConcurrentHashMap обеспечивает thread-safety ⭐⭐⭐
20 Что такое CopyOnWriteArrayList ⭐⭐⭐
21 Когда использовать synchronized collections ⭐⭐
22 Как получить synchronized коллекцию ⭐⭐
23 Что такое Collections.unmodifiableList()
24 Как работает Collections.unmodifiableList() внутри ⭐⭐
25 В чём разница между Iterator и ListIterator ⭐⭐
26 Что такое fail-fast и fail-safe итераторы ⭐⭐
27 Что такое ConcurrentModificationException ⭐⭐
28 Как правильно удалять элементы во время итерации ⭐⭐
29 Что такое Comparable и Comparator ⭐⭐
31 Какие операции поддерживает интерфейс Collection ⭐⭐

🗺️ Карта зависимостей тем

                    ┌──────────────────────────────────────────┐
                    │   1. Collection Framework (Обзор)        │
                    │   Collection, List, Set, Queue, Map      │
                    └──┬──────────┬──────────┬─────────────────┘
                       │          │          │
            ┌──────────┘          │          └──────────┐
            ▼                     ▼                     ▼
    ┌───────────────┐    ┌───────────────┐    ┌────────────────────┐
    │ LIST (3-10)   │    │ SET (11-13)   │    │ MAP (14-20)        │
    │ 3. ArrayList  │    │ 11. HashSet   │    │ 14. Map обзор      │
    │    vs Linked  │    │     vs Linked │    │ 15. HashMap vs     │
    │ 4. Когда что  │    │     vs Tree   │    │     LinkedHashMap  │
    │ 5-6. Big O    │    │ 12. HashSet   │    │     vs TreeMap     │
    │ 7. Vector     │    │     внутри    │    │ 16. Когда TreeMap  │
    │ 8. Stack      │    │ 13. TreeSet   │    │ 17. WeakHashMap    │
    │ 9. Queue      │    │               │    │ 18-19. CHM         │
    │ 10. Deque     │    │               │    │ 20. CopyOnWrite    │
    └───────┬───────┘    └───────┬───────┘    └────────┬───────────┘
            │                    │                     │
            └────────────────────┼─────────────────────┘
                                 ▼
                    ┌──────────────────────────────────────────┐
                    │   THREAD-SAFETY (18-22)                  │
                    │   18-19. ConcurrentHashMap               │
                    │   20. CopyOnWriteArrayList               │
                    │   21-22. synchronized collections        │
                    └──────────────────────────────────────────┘

                    ┌──────────────────────────────────────────┐
                    │   ITERATORS и УДАЛЕНИЕ (23-28)           │
                    │   23-24. unmodifiableList                │
                    │   25. Iterator vs ListIterator           │
                    │   26. fail-fast vs fail-safe             │
                    │   27. ConcurrentModificationException    │
                    │   28. Правильное удаление                │
                    └──────────────────────────────────────────┘

                    ┌──────────────────────────────────────────┐
                    │   СРАВНЕНИЕ и ОБЩИЕ ОПЕРАЦИИ (29, 31)    │
                    │   29. Comparable vs Comparator           │
                    │   31. Операции Collection                │
                    └──────────────────────────────────────────┘

🎯 Рекомендуемый порядок изучения

🟢 Уровень Junior (недели 1-2)

Шаг Тема Файлы Цель
1 Обзор Collection Framework Q1, Q2 Иерархия интерфейсов, List vs Set vs Queue
2 List: ArrayList vs LinkedList Q3, Q4 Когда что использовать
3 Vector, Stack, Queue, Deque Q7, Q8, Q9, Q10 Legacy и современные аналоги
4 Set: HashSet vs TreeSet Q11, Q13 Уникальность и сортировка
5 Map: HashMap vs TreeMap Q14, Q15, Q16 Когда что использовать
6 unmodifiableList Q23, Q24 Защитное копирование
7 Iterator vs ListIterator Q25 Итерация и удаление

🟡 Уровень Middle (недели 3-4)

Шаг Тема Файлы Цель
1 Big O ArrayList Q5 Амортизация, ресайз, System.arraycopy
2 Big O LinkedList Q6 Cache miss, GC pressure
3 HashSet внутри Q12 hashCode, equals, treeification
4 WeakHashMap Q17 WeakReference, GC, ReferenceQueue
5 synchronized collections Q21, Q22 Decorator, mutex, check-then-act
6 fail-fast/fail-safe Q26 modCount, CME, snapshot
7 CME Q27 Причины, subList trap, views
8 Удаление при итерации Q28 removeIf, Iterator.remove
9 Comparable vs Comparator Q29 Timsort, overflow, транзитивность
10 Операции Collection Q31 bulk ops, parallelStream, Spliterator

🔴 Уровень Senior (недели 5-6)

Шаг Тема Файлы Цель
1 ArrayList internals Q5 (Senior) SIMD, branch prediction, CPU pipeline
2 LinkedList internals Q6 (Senior) Cache locality catastrophe, pipeline stall
3 CHM thread-safety Q18, Q19 CAS, volatile, synchronized, LongAdder
4 CopyOnWriteArrayList Q20 Fail-safe, stale data, eventual consistency
5 HashSet internals Q12 (Senior) Treeification, transient, hash collisions
6 TreeMap internals Q13, Q16 Red-black tree, rebalancing, Skip List
7 unmodifiableList internals Q24 Defensive copy, RandomAccess, GC pressure
8 Concurrent collections Q21 (Senior) High contention, compound operations

🔗 Ключевые связи между темами

Тема: List

Q3 (ArrayList vs LinkedList) → Q4 (Когда что) → Q5-Q6 (Big O)
                                       ↓
                              Q7 (Vector) → Q8 (Stack) → Q9 (Queue) → Q10 (Deque)

Ключевые связи:

  • Q3 ↔ Q5-Q6: Big O объясняет, почему ArrayList быстрее LinkedList на практике
  • Q4 ↔ Q28: removeIf() решает проблему удаления в цикле
  • Q7 ↔ Q18: Vector → ConcurrentHashMap (эволюция thread-safety)
  • Q9-Q10 ↔ Q18: BlockingQueue, ConcurrentLinkedQueue как альтернативы

Тема: Set

Q11 (HashSet vs LinkedHashSet vs TreeSet) → Q12 (HashSet внутри) → Q13 (TreeSet)

Ключевые связи:

  • Q11 ↔ Q14: Set использует Map внутри (HashSet = HashMap<E, Object>)
  • Q12 ↔ Q15: Внутренности HashSet = internals HashMap
  • Q13 ↔ Q16: TreeSet = TreeMap.keySet(), когда TreeMap нужен

Тема: Map

Q14 (Map обзор) → Q15 (HashMap vs LinkedHashMap vs TreeMap) → Q16 (TreeMap)
     ↓                        ↓                        ↓
Q17 (WeakHashMap)    Q12 (HashSet внутри)    Q18-19 (ConcurrentHashMap)
                              ↓
                     Q20 (CopyOnWriteArrayList)

Ключевые связи:

  • Q14 ↔ Q1: Map технически НЕ Collection, но часть Framework
  • Q15 ↔ Q12: HashMap internals = HashSet internals
  • Q17 ↔ Q3 (Память и GC): WeakReference, GC, SoftReference
  • Q18-19 ↔ Q21: CHM vs synchronizedList — разные подходы к thread-safety
  • Q18 ↔ Q20: CHM для mixed нагрузки, COWAL для read-heavy

Тема: Thread-Safety

Q7 (Vector) → Q21 (synchronized collections) → Q22 (Как получить)
     ↓                        ↓                        ↓
Q18 (CHM) ←────────── Q19 (CHM thread-safety)  Q20 (CopyOnWriteArrayList)

Ключевые связи:

  • Q7 ↔ Q21: Vector — legacy подход, synchronizedList — современный
  • Q18 ↔ Q20: CHM = granular locks, COWAL = snapshot
  • Q21 ↔ Q26: synchronizedList = fail-fast, CHM = weakly consistent

Тема: Iterators и удаление

Q25 (Iterator vs ListIterator) → Q26 (fail-fast vs fail-safe)
     ↓                                  ↓
Q27 (CME) ←─────────────────────── Q28 (Правильное удаление)
     ↑
Q23-24 (unmodifiableList)

Ключевые связи:

  • Q25 ↔ Q28: Iterator.remove() — правильный способ удаления
  • Q26 ↔ Q27: fail-fast бросает CME, fail-safe — нет
  • Q23-24 ↔ Q27: unmodifiableList не защищает от CME через view

🎓 Шпаргалка: что знать для каждого уровня

🟢 Junior

  • Иерархия: Collection → List/Set/Queue, Map — параллельно
  • ArrayList vs LinkedList: ArrayList для большинства случаев
  • HashSet = уникальность, TreeSet = сортировка
  • HashMap = ключ-значение, TreeMap = сортировка по ключу
  • Vector/Stack — legacy, используйте ArrayList/ArrayDeque
  • Iterator для перебора, нельзя удалять в for-each
  • unmodifiableList = защитная обёртка, не глубокая иммутабельность

🟡 Middle

  • Big O: ArrayList add = амортиз. O(1), get = O(1); LinkedList get = O(n)
  • Cache locality: ArrayList > LinkedList в 10-100 раз при итерации
  • HashSet = HashMap внутри, treeification при > 8 элементов в корзине
  • ConcurrentHashMap: CAS + volatile + synchronized, НЕ блокирует чтение
  • CopyOnWriteArrayList: snapshot, fail-safe, O(n) копирование при записи
  • fail-fast = modCount, CME = детектор багов (не синхронизация!)
  • removeIf() = O(n) для ArrayList, Iterator.remove() = O(n²)
  • Comparable = natural order, Comparator = внешняя сортировка

🔴 Senior

  • System.arraycopy: JVM intrinsic, SIMD, branch prediction
  • LinkedList cache miss: каждый узел — отдельный объект в куче
  • CHM: CounterCells (LongAdder), ForwardingNode, ReservationNode
  • WeakHashMap: ReferenceQueue, expungeStaleEntries, Minor GC
  • ConcurrentHashMap size(): не блокировка, а счётчик через CAS
  • Timsort: стабильная сортировка, транзитивность, overflow
  • Spliterator: характеристики (SIZED, DISTINCT, SORTED) для Stream оптимизации
  • Java 21: SequencedCollection/SequencedSet/SequencedMap

📝 Формат каждого файла

Каждый файл содержит:

  • 🟢 Junior Level — базовое понимание, простые аналогии, примеры
  • 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
  • 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы