Розділ 12 · 23 питань

String

23 питань і відповідей у розділі String.

Ukrainian String Вихідний Markdown
Мовні версії: English Russian Ukrainian

Питання цього розділу

  1. Як працює String Pool?
  2. В чому різниця між створенням String через літерал та через new?
  3. Коли потрібно використовувати intern()?
  4. Чому String є незмінним (незмінюваним)?
  5. Коли використовувати StringBuilder vs StringBuffer?
  6. Чому StringBuffer повільніший за StringBuilder?
  7. Що відбувається при конкатенації рядків через оператор +?
  8. Як компілятор Java оптимізує конкатенацію рядків?
  9. Чи можна використовувати == для порівняння String?
  10. В чому різниця між == та equals() для String?
  11. В якій області пам’яті зберігається String Pool?
  12. Чи може String Pool стати причиною OutOfMemoryError?
  13. Що робить метод substring() і як він працював до Java 7?
  14. Чому змінилася реалізація substring() в Java 7?
  15. Як працює метод split()?
  16. В чому особливість методу replace() vs replaceAll()?
  17. Що таке кодування String?
  18. Як правильно перетворити String в byte[] і назад?
  19. Що таке компактні рядки в Java 9+?
  20. Як дізнатися, скільки пам’яті займає String?
  21. Чи можна змінити вміст String через рефлексію?
  22. Що таке дедуплікація рядків в G1 GC?
  23. Чому String реалізує Comparable та CharSequence?

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

23 запитання для підготовки до співбесіди на Middle Java Developer.


📋 Усі запитання

# Запитання Рівень складності
1 Як працює String Pool ⭐⭐
2 В чому різниця між створенням String через літерал та через new
3 Коли варто використовувати intern() ⭐⭐⭐
4 Чому String є незмінним ⭐⭐
5 Коли використовувати StringBuilder, а коли StringBuffer
6 Чому StringBuffer повільніший за StringBuilder ⭐⭐
7 Що відбувається при конкатенації рядків через оператор + ⭐⭐
8 Як компілятор Java оптимізує конкатенацію рядків ⭐⭐⭐
9 Чи можна використовувати == для порівняння String
10 В чому різниця між == та equals() для String ⭐⭐
11 В якій області пам’яті зберігається String Pool ⭐⭐⭐
12 Чи може String Pool викликати OutOfMemoryError ⭐⭐⭐
13 Що робить метод substring() і як він працював до Java 7 ⭐⭐
14 Чому змінили реалізацію substring() в Java 7 ⭐⭐
15 Як працює метод split() ⭐⭐
16 В чому особливість метода replace() vs replaceAll() ⭐⭐
17 Що таке String encoding (кодування) ⭐⭐
18 Як правильно конвертувати String в byte[] і назад ⭐⭐
19 Що таке compact strings в Java 9+ ⭐⭐⭐
20 Як дізнатись, скільки пам’яті займає String ⭐⭐⭐
21 Чи можна змінити вміст String через рефлексію ⭐⭐⭐
22 Що таке String deduplication в G1 GC ⭐⭐⭐
23 Чому String implements Comparable та CharSequence ⭐⭐

🗺️ Карта залежностей тем

                    ┌──────────────────────────────────────────┐
                    │   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
  • @Stable annotation, 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
  • 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми