Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

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().


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
30 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу