Какой максимальный размер строки на входе и нужно ли его обрабатывать
Что проверяют
Вопрос бывает в двух ролях. На лайвкодинге его задаёте вы сами до того, как писать решение: от ответа зависит, пройдёт ли алгоритм за O(n²). В теоретической части его задают вам, чтобы понять, знаете ли вы реальные пределы String и ограничиваете ли вход на границе системы, а не ловите OutOfMemoryError.
Как отвечать
Про пределы самой строки:
- теоретический максимум: длина
Stringимеет типint, значит не большеInteger.MAX_VALUE, около 2,1 млрд символов; - на практике меньше: с Java 9 строка хранится в
byte[](компактные строки). Если в ней есть символы вне Latin-1, а кириллица как раз вне, на символ уходит два байта, и предел падает примерно вдвое. HotSpot к тому же не создаёт массив длиной ровноInteger.MAX_VALUE, а реальный потолок задаёт куча (-Xmx); - литерал в коде: строковая константа в class-файле ограничена 65535 байтами, длиннее компилятор не пропустит.
Обрабатывать нужно, и это вопрос защиты сервиса. Лимиты ставят как можно раньше:
- размер запроса: ограничения веб-сервера и Spring Boot на тело, заголовки и multipart (
spring.servlet.multipart.max-file-size,max-request-size); - валидация DTO:
@Size(max = ...)из Bean Validation, согласованный с длиной колонки в базе; - парсер: Jackson начиная с 2.15 ограничивает длину строковых значений через
StreamReadConstraints; - большие данные: файл на гигабайты не читают в одну
String, его обрабатывают потоком черезBufferedReaderилиInputStream.
На лайвкодинге хватит короткой фразы: «Если строка до 10⁵, решение за O(n log n) проходит, пустую строку и null обработаю отдельно».
Где спотыкаются
Советуют ловить OutOfMemoryError в try-catch. После этой ошибки состояние JVM ненадёжно, её предотвращают лимитами, а не перехватывают.
Повторяют «строка это массив char». С Java 9 внутри byte[] и признак кодировки, отсюда разница в пределе для кириллицы и латиницы.
Не проверяют длину перед регулярным выражением. Длинный вход и шаблон с вложенными квантификаторами дают катастрофический бэктрекинг и зависший поток.