У меня было похожее требование, когда я наткнулся на этот пост.Я хотел быстрый способ построить строку, которая может расти с обеих сторон, т.е.добавить новые буквы на передней и задней части произвольно.Я знаю, что это старый пост, но он вдохновил меня попробовать несколько способов создания строк, и я решил поделиться своими выводами.Я также использую некоторые конструкции Java 8, которые могли бы оптимизировать скорость в случаях 4 и 5.
https://gist.github.com/SidWagz/e41e836dec65ff24f78afdf8669e6420
В приведенном выше Gist приведен подробный код, который может выполнить любой.Я взял несколько способов выращивания струн в этом;1) Добавить в StringBuilder, 2) Вставить в начало StringBuilder, как показано @Mehrdad, 3) Частично вставить в начало, а также в конец StringBuilder, 4) Использование списка для добавления в конец, 5) Использование Deque длядобавление спереди.
// Case 2
StringBuilder build3 = new StringBuilder();
IntStream.range(0, MAX_STR)
.sequential()
.forEach(i -> {
if (i%2 == 0) build3.append(Integer.toString(i)); else build3.insert(0, Integer.toString(i));
});
String build3Out = build3.toString();
//Case 5
Deque<String> deque = new ArrayDeque<>();
IntStream.range(0, MAX_STR)
.sequential()
.forEach(i -> {
if (i%2 == 0) deque.addLast(Integer.toString(i)); else deque.addFirst(Integer.toString(i));
});
String dequeOut = deque.stream().collect(Collectors.joining(""));
Я сосредоточусь на передних случаях добавления, т. е.случай 2 и случай 5. Реализация StringBuilder внутренне решает, как растет внутренний буфер, что помимо перемещения всего буфера слева направо в случае добавления фронта ограничивает скорость.Хотя время, затрачиваемое на вставку непосредственно в переднюю часть StringBuilder, возрастает до действительно высоких значений, как показывает @Mehrdad, если нужно, чтобы строки длиной не превышали 90 тыс. Символов (что по-прежнему много), передняя вставка будетпостроить строку в то же время, которое требуется для создания строки той же длины, добавив в конце.То, что я говорю, это то, что временное наказание действительно пинает и огромно, но только тогда, когда вам нужно создать действительно огромные строки.Можно использовать deque и соединить строки в конце, как показано в моем примере.Но StringBuilder немного более интуитивно понятен для чтения и кодирования, и штрафы не будут иметь значения для строк меньшего размера.
На самом деле производительность для случая 2 намного выше, чем для случая 1, что, похоже, я не понимаю.Я предполагаю, что рост внутреннего буфера в StringBuilder будет одинаковым в случае фронтального и обратного добавления.Я даже установил минимальную кучу на очень большую величину, чтобы избежать задержки роста кучи, если бы это сыграло свою роль.Может быть, кто-то, у кого есть лучшее понимание, может прокомментировать ниже.