Почему Строки в Java - это не так просто, как кажется

Строки в Java - это капкан для разработчика, с виду базовый тип, а по факту кучу нюансов, но которых спотыкаются и на собеседованиях, и на проде.

Вся логика и боль упираются в неизменяемость. String создан ради безопасности и многопоточности, но любая модификация создает новый объект. Конкатенация в цикле через обычный плюс моментально забивает память, превращая работу Garbage Collector в ад - для таких задач должен быть только StringBuilder.

Из неизменяемости вытекает String Pool: JVM сохраняет литералы для повторного использования. Если написать new String("hello"), вы обойдете пул и создадите лишний объект в куче. По этой же причине сравнение через == вместо .equals() - классическая мина. Ссылка может совпасть в тесте, но разваливаться на реальных данных.

Внутри тоже всё меняется. С Java 9 работают Compact Strings. Если внутри строки только LATIN-1, она использует byte[] вместо char[], срезая потребление памяти почти вдвое без нашего участия. А из приятного свежего - текстовые блоки избавляют от экранирования при вёрстке JSON и SQL, а методы вроде .isBlank() и .strip() делают код гораздо чище. Понимание этих мелочей - это грань между кодом, который просто работает, и кодом который не падает под нагрузкой.

1