Коллекции
30 вопросов и ответов в разделе Коллекции.
Вопросы этого раздела
- Какие основные интерфейсы Collection Framework?
- В чём разница между List, Set и Queue?
- В чём разница между ArrayList и LinkedList?
- Когда использовать ArrayList, а когда LinkedList?
- Какова временная сложность операций в ArrayList?
- Какова временная сложность операций в LinkedList?
- Что такое Vector и чем он отличается от ArrayList?
- Что такое Stack?
- Что такое Queue и какие реализации существуют?
- Что такое Deque?
- В чём разница между HashSet, LinkedHashSet и TreeSet?
- Как работает HashSet внутри?
- Что такое TreeSet и как он работает?
- Что такое Map и какие реализации существуют?
- В чём разница между HashMap, LinkedHashMap и TreeMap?
- Когда использовать TreeMap?
- Что такое WeakHashMap?
- Что такое ConcurrentHashMap?
- Как ConcurrentHashMap обеспечивает thread-safety?
- Что такое CopyOnWriteArrayList?
- Когда использовать synchronized collections?
- Как получить synchronized коллекцию?
- Что такое Collections.unmodifiableList()?
- Как работает Collections.unmodifiableList() внутри
- В чём разница между Iterator и ListIterator?
- Что такое fail-fast и fail-safe итераторы?
- Что такое ConcurrentModificationException?
- Как правильно удалять элементы во время итерации?
- Что такое Comparable и Comparator?
- Какие операции поддерживает интерфейс Collection?
Навигатор по разделу
30 вопросов для подготовки к собеседованию на Middle Java Developer.
📋 Все вопросы
🗺️ Карта зависимостей тем
┌──────────────────────────────────────────┐
│ 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
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы