String
23 вопросов и ответов в разделе String.
Вопросы этого раздела
- Как работает String Pool?
- В чём разница между созданием String через литерал и через new?
- Когда стоит использовать intern()?
- Почему String является иммутабельным (неизменяемым)?
- Когда использовать StringBuilder, а когда StringBuffer?
- Почему StringBuffer медленнее StringBuilder?
- Что происходит при конкатенации строк через оператор +?
- Как компилятор Java оптимизирует конкатенацию строк?
- Можно ли использовать == для сравнения String?
- В чём разница между == и equals() для String?
- Где хранится String Pool (в какой области памяти)?
- Может ли String Pool вызвать OutOfMemoryError?
- Что делает метод substring() и как он работал до Java 7?
- Почему изменили реализацию substring() в Java 7?
- Как работает метод split()?
- В чём особенность метода replace() vs replaceAll()?
- Что такое String encoding (кодировка)?
- Как правильно конвертировать String в byte[] и обратно?
- Что такое compact strings в Java 9+?
- Как узнать, сколько памяти занимает String?
- Можно ли изменить содержимое String через рефлексию?
- Что такое String deduplication в G1 GC?
- Почему String implements 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
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы