В чем разница между StringBuilder и ArrayList <String>? - PullRequest
0 голосов
/ 21 октября 2018

В интервью я хочу создать новую строку с некоторыми подстроками.Я утверждал, что ArrayList<String> почти совпадает с StringBuilder, но интервьюер сказал, что я всегда должен использовать StringBuilder, если мне нужно иметь дело со String.Я думаю, что временная сложность добавления / удаления функций между ними одинакова.

Ответы [ 6 ]

0 голосов
/ 22 октября 2018

Если вам нужен один String в конце, производительность и потребление памяти наверняка будут отличаться.Всякий раз, когда вы строите String из деталей, в хорошем случае вы в конечном итоге используете StringBuilder, или в несколько худшем случае StringBuffer, а в худшем случае выв итоге объединяем две строки, затем отбрасываем их и повторяем - в этом случае много выделений и сборщика мусора.

JLS12 по-прежнему упоминает StringBuffer по имени для оптимизации (но, надеюсь, StringBuilder используется внутренне, как аналогичная техника ):

Реализация может выбрать выполнение преобразования и объединения за один шаг, чтобы избежать создания, а затем отбрасывания промежуточного объекта String,Чтобы повысить производительность многократной конкатенации строк, компилятор Java может использовать класс StringBuffer или аналогичный метод для уменьшения числа промежуточных объектов String, которые создаются путем вычисления выражения.

InВ конкретном случае наличия List<String> и последующего использования String.join() на нем StringJoiner содержит конкретный объект StringBuilder, который будет использоваться.
Таким образом, будет построительв любом случае, и тогда может быть более эффективно использовать его с самого начала.

0 голосов
/ 21 октября 2018

Вы можете "строить" строки, используя оба.Однако StringBuilder - это класс, специализирующийся на построении строк с его методами append insert delete charAt и т. Д.ArrayList - это коллекция общего назначения, в которой отсутствует большая часть этой функциональности.Рассмотрите возможность реализации следующего (надуманного примера) с ArrayList:

    StringBuilder sb = new StringBuilder().append("time: ")
            .append(System.currentTimeMillis())
            .deleteCharAt(4)
            .reverse();

    System.err.println(sb); // 3153067310451 emit

Эргономика и удобочитаемость, есть соображения производительности, но они в значительной степени не имеют отношения к примерам тривиального размера.

0 голосов
/ 21 октября 2018

Все сводится к потреблению памяти.String является объектом, в то время как ArrayList<String> содержит отдельные объекты, StringBuilder содержит только один.

0 голосов
/ 21 октября 2018

Они совсем не одно и то же.StringBuilder создает одну строку, в то время как ArrayList<String> это просто массив - отдельных строк.Конечно, вы можете объединить все строки массива с помощью String.join("", list), где первый аргумент - это разделитель, который вы хотите использовать, но зачем вам идти по этому пути вместо того, чтобы просто использовать класс, предназначенный для точно что вы пытаетесь сделать в первую очередь?

0 голосов
/ 21 октября 2018

StringBuilder имеет функцию-член для возврата всей построенной строки, тогда как в ArrayList вы должны сами объединить строки.

0 голосов
/ 21 октября 2018

Если вам по-прежнему не нужны отдельные элементы, которые вы добавляете в список, вы должны использовать StringBuilder.

В конце концов, вы не можете напрямую получить объединенную строку из содержимого списка: вынужно поместить его, скажем, в StringBuilder.

Но в конкретном случае построения строки из подстрок , StringBuilder предоставляет методы, позволяющие добавлять части String s без использования substring: метод append(CharSequence, int, int) - это оптимизация, позволяющая избежать создания этой дополнительной строки.


Следует отметить, что, по крайней мере, когда я писал Python, он был рассмотренЛучше составить список, а затем использовать ''.join(theList) в конце, который по сути является аналогом ArrayList<String>.

Я не знаю достаточно о Python, чтобы понять, почему это считается особенно лучше.

...