Правильный ответ - нет. Функционал регулярок - это найти и указать найденное. Вы можете посмотреть как работает Pattern/Matcher в паре. Они просто находят группы выражений и указывают пальцем дескыть вот здесь матчинг подошел.
Но есть API языков программирования такой как String::replace который позволяет с ИСПОЛЬЗОВАНИЕМ
регулярок найти-и-заменить одной операцией.
Но данную конкретную операцию - капитализацию первой буквы в Java-строке я-бы сделал просто через substring() и toUpper(). Это будет по времени в сотни раз быстрее т.к. мы не будем вовлекать в процесс компилляцию паттерна регулярок. Грубо говоря если ты решил пальнуть по птичкам - то бери рогатку. Пушка тебе не нужна.
Здесь заложена потенциальная ошибка гонок. Главный и дочерний потоки не синхронизируются через объекты синхронизации. Это означает что если дочерний объект тупанул в фазе например JIT компилляции то главный его не будет ждать и завершит приложение. И мы можем (теоретически) не увидеть даже следов работы дочернего потока. Искусственные паузы sleep() не являются механизмом синхронизации и их не стоит использовать для той цели которую хочет достичь автор. Нужен нормальный join. Или ожидание финала ThreadPool.
1) Что такое data? Почему ты названия классов пишешь с маленькой буквы? Это вроде бы пустяк но это раздражает читающего твой код. Возникает подозрение об ошибке или о некорректной копи-пасте.
2) Очень сложно понять что ты хотел получить на выходе. Нарисуй образец желаемого документа в Json и тебе помогут быстрее.
По смыслу эта задача похожа на Квадрат Полибия. Автор может погуглить по этому ключевому слову и найти готовые реализации. Но мне кажется что у автора еще куда большие пробелы в навыках. Нужно иметь навык в написании вложенных циклов.
Тоесть потренироваться на простых задачах.
А эту сложную задачу либо вообще отложить пока. Либо разбить на последовательность элементарных. Как разбить я не знаю. Это автор должен сам для себя придумать исходя из своего понимания шагов.
6453 мс - это подозрительно малое время до срабатывания JIT-компиллятора. Скорее всего код не прогрет.
Автору рекомендую посмотреть на фреймворк JMH. С помощю него можно делать "прогрев" байткода. Это нужно для гарантии того что все переходные процессы в компилляторе закончились и JVM вошла в стационарное состояние при котором можно начинать делать какие-либо измерения.
+1 к теме валидности. Цикл for подозрительно простой. Необходимо начинать бенчмарк только после того как есть хотя-бы покрытие тестирования. Что пользы в копировании которое не копирует или копирует неправильно.
(забегая вперед я скажу что не смотрел детально код. Это так. Общее впечатление о подходе автора)
Вообще тема перформанса очень сложная и деликатная. Рекомендую также автору посомтреть лекции Шипилёва и Елизарова в youtube
В топике звучат 3 задачи. Первое это собственно парсинг сайтов. Это селениум.
И второе это написание бэка. Это вообще любой язык разработки бэка java/python/node/dotnet
и фреймворки Spring/Django/Express e.t.c. И третье - это веб-сервис. Это еще более ужесточение
предыдущего задания с протколами REST/SOAP e.t.c.
C++ остается сильным направлением только в геймдеве. Во всем остальном он уже не рулит. Изучай Java если хочешь бабло зарабатывать. С++ выучишь потом для души.
Это сложно потому-что
- сборщики мусора - неуправляемые с точки зрения API (вызов System.GC может ничего не делать или быть заглушкой)
- они разные (G1GC, CMS.... ) и по разному себя ведут.
И тот преподаватель который дал такую задачу должен был уточнить Каким образом он хотел увидеть результат. В противном случае получается игра в "Штурман-прибор-100"
По сути единственную вещь которую вы можете продемонстрировать это OutOfMemoryException.
Красивое и быстрое - обычно антогонизмы. Быстрое решение будет StringBuilder с указанием прогнозируемого размера результирующей строки в конструкторе. Это будет почти самое быстрое решение. Но оно будет иметь явный цикл. А это некрасиво. Красивое-же содержит просто вызов StringUtils.replace(....) или нечто в этом роде. Но не факт что оно - самое быстрое.
Никто не мокает коннекшен. Это не твоя библиотека а драйверно-базовая. И в ней нет бизнес-логики и нечего тестировать. Ты же не сотрудник Oracle? Верно?
Тебе нужно сделать декомпозицию твоей задачи на DAO объекты и бизнес логику и замокать только DAO.
Тогда процесс тестирования упрощается.