Работа со строками

Тема дорожной карты · Java

Строки в Java — это неизменяемые последовательности Unicode-символов, представленные классом java.lang.String, что делает их наиболее часто используемым ссылочным типом на JVM и критически важной концепцией для каждого Java-разработчика. Поскольку объекты String неизменяемы, каждая конкатенация через + в цикле создаёт новые объекты в куче и увеличивает нагрузку на GC; JDK предоставляет StringBuilder (однопоточный) и StringBuffer (синхронизированный) для изменяемого построения строк, а методы String.join(), String.format() и formatted() — для лаконичной компоновки. Класс String предоставляет богатый API для поиска (indexOf, contains, startsWith, endsWith), преобразования (toLowerCase, toUpperCase, trim, strip, replace, replaceAll), разбиения (split(regex)) и конвертации (valueOf, toCharArray, chars() с возвратом IntStream) — всё это активно используется при обработке ResultSet в JDBC, разборе HTTP-запросов и логике контроллеров Spring MVC. Строки Java интернируются в пуле строк JVM (в куче начиная с Java 7): строковые литералы с одинаковым содержимым используют один и тот же объект String, что делает сравнение через == неожиданно корректным для литералов, но опасно неверным для динамически построенных строк — всегда используйте equals() или equalsIgnoreCase(). Современные строки Java дополняются Text Blocks (Java 15+) для многострочных литералов и String.formatted() в качестве метода-псевдонима String.format() для удобного встраивания в цепочки вызовов, что уменьшает шаблонный код при работе с JSON/SQL-шаблонами.

Как это работает

Работа со строками покрывает классы (единица компиляции), примитивные типы (int, long, double, boolean — не объекты), reference-типы (объекты, массивы, String — на heap), управление (if/else, switch — теперь со стрелочной формой и pattern matching в 21+), циклы (for, while, for-each), пакеты + импорты, модификаторы доступа (public/protected/package-private/private). Современная Java: var для type inference (10+), текстовые блоки """...""" (15+), records (16+), sealed classes (17+), pattern matching (21+).

Когда применять

Современные фичи — при таргете 17+: records для DTO (срезает 90% бойлерплейта), var для type-inference локальной переменной (когда RHS очевиден), текстовые блоки для multi-line строк, sealed-типы для закрытых иерархий. var — не для полей и возвратов методов (теряется читаемость). Optional — осторожно; никогда .get() без проверки; используйте .orElse(), .map(), .ifPresent().

Типичные ошибки

Ловушки Работа со строками: сравнение строк == вместо .equals() (классика); примитивные массивы там, где коллекции лучше; игнор Optional и возврат null (NPE-чума продолжается); String s = ""; for(...) s += x; (квадратично — используйте StringBuilder). Читайте Java-туториал для вашей версии; старые туториалы отстают.

Связанные понятия

Полезные ресурсы