String
23 питань і відповідей у розділі String.
Питання цього розділу
- Як працює String Pool?
- В чому різниця між створенням String через літерал та через new?
- Коли потрібно використовувати intern()?
- Чому String є незмінним (незмінюваним)?
- Коли використовувати StringBuilder vs StringBuffer?
- Чому StringBuffer повільніший за StringBuilder?
- Що відбувається при конкатенації рядків через оператор +?
- Як компілятор Java оптимізує конкатенацію рядків?
- Чи можна використовувати == для порівняння String?
- В чому різниця між == та equals() для String?
- В якій області пам’яті зберігається String Pool?
- Чи може String Pool стати причиною OutOfMemoryError?
- Що робить метод substring() і як він працював до Java 7?
- Чому змінилася реалізація substring() в Java 7?
- Як працює метод split()?
- В чому особливість методу replace() vs replaceAll()?
- Що таке кодування String?
- Як правильно перетворити String в byte[] і назад?
- Що таке компактні рядки в Java 9+?
- Як дізнатися, скільки пам’яті займає String?
- Чи можна змінити вміст String через рефлексію?
- Що таке дедуплікація рядків в G1 GC?
- Чому String реалізує Comparable та CharSequence?
Навігатор по розділу
23 запитання для підготовки до співбесіди на Middle Java Developer.
📋 Усі запитання
🗺️ Карта залежностей тем
┌──────────────────────────────────────────┐
│ STRING POOL І СТВОРЕННЯ (1-3) │
│ 1. String Pool │
│ 2. Літерал vs new │
│ 3. intern() │
└──────────────────┬───────────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ НЕЗМІННІСТЬ │ │ КОНКАТЕНАЦІЯ │ │ ПОРІВНЯННЯ │
│ ТА МОДИФІКАЦІЯ │ │ (7-8) │ │ (9-10) │
│ (4-6) │ │ 7. Оператор + │ │ 9. == для String │
│ 4. Чому immut │ │ 8. Оптимізація │ │ 10. == vs equals │
│ 5. StringBuilder│ │ компілятора │ │ │
│ 6. StringBuffer │ │ │ │ │
└───────┬───────┘ └───────┬───────┘ └────────┬───────────┘
│ │ │
└────────────────────────┼────────────────────────┘
▼
┌──────────────────────────────────────────┐
│ ПАМ'ЯТЬ ТА ВНУТРІЩНІСТЬ (11-12, 19-22) │
│ 11. Де зберігається String Pool │
│ 12. OOM із String Pool │
│ 19. Compact Strings (Java 9+) │
│ 20. Розмір String у пам'яті │
│ 21. Рефлексія на String │
│ 22. String Deduplication (G1 GC) │
└──────────────────────────────────────────┘
│
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ МЕТОДИ │ │ КОДУВАННЯ │ │ ІНТЕРФЕЙСИ │
│ (13-16) │ │ (17-18) │ │ (23) │
│ 13. substring │ │ 17. Encoding │ │ 23. Comparable + │
│ 14. substring │ │ 18. String ↔ │ │ CharSequence │
│ Java 7 fix │ │ byte[] │ │ │
│ 15. split │ │ │ │ │
│ 16. replace │ │ │ │ │
└───────────────┘ └───────────────┘ └────────────────────┘
🎯 Рекомендований порядок вивчення
🟢 Рівень Junior (тижні 1-2)
| Крок | Тема | Файли | Мета |
|---|---|---|---|
| 1 | String Pool | Q1, Q2 | Як створюються рядки, літерали vs new |
| 2 | StringBuilder vs StringBuffer | Q5, Q6 | Коли що використовувати |
| 3 | Конкатенація + | Q7 | Що відбувається під капотом |
| 4 | == vs equals | Q9, Q10 | Чому == не для порівняння вмісту |
| 5 | substring/split/replace | Q13, Q15, Q16 | Базові методи роботи з рядками |
🟡 Рівень Middle (тижні 3-4)
| Крок | Тема | Файли | Мета |
|---|---|---|---|
| 1 | intern() | Q3 | Коли економить пам’ять, коли шкодить |
| 2 | Незмінність | Q4 | Навіщо String immutable, ціна |
| 3 | Оптимізації компілятора | Q8 | Constant folding, invokedynamic |
| 4 | Кодування | Q17, Q18 | UTF-8, UTF-16, конвертація в byte[] |
| 5 | Пам’ять | Q20 | Скільки байт займає String |
🔴 Рівень Senior (тижні 5-6)
| Крок | Тема | Файли | Мета |
|---|---|---|---|
| 1 | String Pool internals | Q11, Q12 | StringTable, OOM, resizing |
| 2 | Compact Strings | Q19 | Latin1 vs UTF-16, coder field, SIMD |
| 3 | substring Java 6→7 | Q13, Q14 | Shared array memory leak, why changed |
| 4 | Reflection on String | Q21 | setAccessible, module system, dangers |
| 5 | String Deduplication | Q22 | G1 GC, ZGC, @Stable, thread safety |
| 6 | Comparable + CharSequence | Q23 | HashMap tree bins, CharSequence contract |
🔗 Ключові зв’язки між темами
Тема: String Pool
Q1 (String Pool) → Q2 (Літерал vs new) → Q3 (intern())
↓
Q11 (Де зберігається) → Q12 (OOM із String Pool)
Ключові зв’язки:
- Q1 ↔ Q11: String Pool зберігається в Java Heap (з Java 7u6)
- Q3 ↔ Q12: Масовий intern() → переповнення StringTable → OOM
- Q2 ↔ Q3:
new String("...").intern()vs"..."— коли має сенс
Тема: Незмінність та модифікація
Q4 (Незмінність) → Q5 (StringBuilder vs StringBuffer) → Q6 (Чому StringBuffer повільніший)
Ключові зв’язки:
- Q4 ↔ Q5: Незмінність = кожен concat = новий об’єкт → StringBuilder для модифікацій
- Q5 ↔ Q6: synchronized overhead, biased locking removal (Java 15+)
Тема: Конкатенація
Q7 (Оператор +) → Q8 (Оптимізація компілятора)
Ключові зв’язки:
- Q7 ↔ Q8: Java 8 → StringBuilder, Java 9+ → invokedynamic (JEP 280)
Тема: Порівняння
Q9 (==) → Q10 (== vs equals)
Ключові зв’язки:
- Q9 ↔ Q10: == порівнює посилання, equals() — вміст
Тема: Пам’ять та внутрішність
Q19 (Compact Strings) → Q20 (Розмір String) → Q21 (Рефлексія) → Q22 (Deduplication)
Ключові зв’язки:
- Q19 ↔ Q20: coder field визначає Latin1 (1 byte/char) vs UTF-16 (2 bytes/char)
- Q20 ↔ Q22: Deduplication економить пам’ять при дублікатах String
- Q21 ↔ Q4: Рефлексія може порушити незмінність (але заблоковано module system)
Тема: Методи та кодування
Q13 (substring) → Q14 (substring Java 7 fix)
Q15 (split) → Q16 (replace vs replaceAll)
Q17 (Encoding) → Q18 (String ↔ byte[])
🎯 Шпаргалка: що знати для кожного рівня
🟢 Junior
- String immutable — не можна змінити після створення
- Літерали = з пулу,
new String()= новий об’єкт - StringBuilder для модифікацій, StringBuffer для багатопотоковості
==порівнює посилання,equals()— вміст+для 1-2 рядків ок, для циклу — StringBuilder
🟡 Middle
- String Pool у Java Heap (з Java 7u6), intern() економить пам’ять при дублікатах
- Compact Strings (Java 9+): Latin1 (1 byte/char) для ASCII, UTF-16 для інших
split()— Fast Path для простих роздільників, regex для складнихreplace()— literal заміна,replaceAll()— regex- Кодування за замовчуванням залежить від ОС — завжди вказуйте явно
🔴 Senior
- StringTable — нативна хеш-таблиця, resizable з JDK 11 (JEP 341)
- substring Java 6: shared char[] (memory leak), Java 7+: копія масиву
- invokedynamic для конкатенації (JEP 280, Java 9+), StringConcatFactory
@Stableannotation, coder field, SIMD оптимізації для equals()- Reflection на String заблокована module system (Java 9+, enforced Java 16+)
- G1 String Deduplication: економить 10-30% пам’яті при дублікатах, не для ZGC
📝 Формат кожного файлу
Кожен файл містить:
- 🟢 Junior Level — базове розуміння, прості аналогії, приклади
- 🟡 Middle Level — внутрішність, типові помилки, практичні приклади
- 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
- 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми