Раздел 12 · 23 вопросов

String

23 вопросов и ответов в разделе String.

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

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

  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?

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

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
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы