Regex не создает дополнительных строк.Он проверяет, что строки соответствуют (или не совпадают) шаблону.
Группы захвата возвращают обратно строки, но строки в Java не являются изменяемыми, поэтому их нельзя представить в изменяемой области хранения,или даже часть изменяемой области хранения.
Кроме того, операция Regex - это не один шаг (даже если он присутствует в коде), а запуск конечного автомата со строкой в качестве входных данных.Java является многопоточным, и конечный автомат не будет работать правильно, если данные изменяются по мере того, как машина работает над ним.Чтобы исправить это, потребовалась бы блокировка буфера, что повлекло бы за собой дополнительные издержки.
Между накладными расходами блокировки и накладными расходами на наличие другого объекта String накладные расходы на блокировку позволили бы сэкономить на поддержании двух неизменяемыхобъекты отрицательные.Короче говоря, вы бы потратили гораздо больше процессорных циклов на получение блокировки, чем сэкономили бы, если бы не иметь дюжину (или, вероятно, даже сотню) дополнительных строк.
Наконец, вся JVM содержит строковые оптимизации.Если вам нужна изменяемая строка, эта оптимизация не будет работать и приведет к странному поведению в одном из наиболее часто используемых типов данных в JVM.