Есть ли в Java эффективный способ выполнения нескольких операций регулярного выражения replaceAll над StringBuilder? - PullRequest
0 голосов
/ 08 декабря 2018

Я бы хотел использовать что-то вроде StringBuilder для хранения строки, а затем эффективно выполнить большое количество операций регулярного выражения replaceAll над ней.Я хотел бы использовать массив переменных размеров StringBuilder и предотвратить временное размещение строк.То есть я бы хотел, чтобы операция регулярного выражения replaceAll изменяла массив, содержащийся в StringBuilder, по мере необходимости, без выделения временных строк.Как я могу это сделать?

К сожалению, у StringBuilder нет встроенного метода для этого.В нем есть только метод replace () без регулярных выражений, и я не могу найти способ сделать это без эффективной замены всего буфера StringBuilder на недавно выделенную строку с использованием Matcher, чего я хотел бы избежать.

1 Ответ

0 голосов
/ 08 декабря 2018

Regex не создает дополнительных строк.Он проверяет, что строки соответствуют (или не совпадают) шаблону.

Группы захвата возвращают обратно строки, но строки в Java не являются изменяемыми, поэтому их нельзя представить в изменяемой области хранения,или даже часть изменяемой области хранения.

Кроме того, операция Regex - это не один шаг (даже если он присутствует в коде), а запуск конечного автомата со строкой в ​​качестве входных данных.Java является многопоточным, и конечный автомат не будет работать правильно, если данные изменяются по мере того, как машина работает над ним.Чтобы исправить это, потребовалась бы блокировка буфера, что повлекло бы за собой дополнительные издержки.

Между накладными расходами блокировки и накладными расходами на наличие другого объекта String накладные расходы на блокировку позволили бы сэкономить на поддержании двух неизменяемыхобъекты отрицательные.Короче говоря, вы бы потратили гораздо больше процессорных циклов на получение блокировки, чем сэкономили бы, если бы не иметь дюжину (или, вероятно, даже сотню) дополнительных строк.

Наконец, вся JVM содержит строковые оптимизации.Если вам нужна изменяемая строка, эта оптимизация не будет работать и приведет к странному поведению в одном из наиболее часто используемых типов данных в JVM.

...