Зарегистрируйтесь, чтобы продолжить обучение

StringBuilder Java: Массивы

Генерация строк в циклах — задача, часто возникающая на практике. Типичный пример — метод, помогающий генерировать HTML-списки. Он принимает на вход массив элементов и возвращает HTML-список из них:

String[] items = {"milk", "butter", "bread"};

HtmlBuilder.buildList(items);
// Так выглядит список в HTML
// Теги <li> для каждого элемента внутри одного тега <ul>
// <ul>
//     <li>milk</li>
//     <li>butter</li>
//     <li>bread</li>
// </ul>

Как можно решить эту задачу "в лоб":

  1. Создать переменную result и записать в нее <ul>.
  2. Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент <li>.
  3. Добавить в конце </ul> и вернуть result из функции.
class HtmlBuilder {
    public static String buildList(String[] items) {
        var result = "<ul>";
        for (var item : items) {
            result = result + "<li>" + item + "</li>";
        }
        result = result + "</ul>";

        return result;
    }
}

Такой способ вполне рабочий, но для большинства языков программирования максимально неэффективный. Дело в том, что конкатенация порождает новую строчку вместо старой, — и подобная ситуация повторяется на каждой итерации. Причем строка становится все больше и больше. Копирование строк приводит к серьезному расходу памяти и влияет на производительность.

Правильный способ для динамической сборки строк в Java - использование класса StringBuilder. Он позволяет собирать строку по кусочкам без лишнего копирования. Перепишем наш пример:

class HtmlBuilder {
    public static String buildList(String[] items) {
        // Инициализируем с начальной строкой "<ul>"
        var result = new StringBuilder();
        result.append("<ul>");
        // Или можно сразу
        // var result = new StringBuilder("<ul>");
        for (var item : items) {
            // append дополняет строку
            result.append("<li>");
            result.append(item);
            result.append("</li>");
        }
        result.append("</ul>");

        // toString собирает все части в одну строку
        return result.toString();
    }
}

Размер кода практически не изменился, но способ формирования результата стал другим. Вместо перезаписи строки, создается объект, который "накапливает" внутри себя части новой строки. Затем этот объект превращается в строку с помощью метода toString().


Дополнительные материалы

  1. Клас StringBuilder

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff