← Назад к вопросам

Что значит создание строк в StringBuilder?

1.0 Junior🔥 181 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что значит создание строк в StringBuilder?

StringBuilder — это класс в Java, который предназначен для эффективного построения строк. В отличие от String, который является неизменяемым (immutable), StringBuilder позволяет модифицировать содержимое строки без создания новых объектов в памяти.

Строки (String) — неизменяемы

Сначала поймем проблему с обычными строками:

String str = "Hello";
str = str + " World"; // На самом деле создается новый объект!

Что происходит под капотом:

  1. Создается первый объект String: "Hello"
  2. При конкатенации (+) создается новый объект String: "Hello World"
  3. Старый объект "Hello" становится мусором и удаляется garbage collector'ом

Это экономически неэффективно, если нужно много раз конкатенировать строки.

StringBuilder — эффективное решение

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"

В этом случае:

  1. Создается один объект StringBuilder
  2. Каждый вызов append() расширяет внутренний буфер символов
  3. Не создается новых объектов String при каждой операции
  4. Только при вызове toString() создается финальный String объект

Внутреннее устройство StringBuilder

// Под капотом StringBuilder использует массив символов
public class StringBuilder {
    private char[] value; // Внутренний буфер
    private int count;    // Текущая длина
    
    public StringBuilder append(String str) {
        // Если буфер маленький, он расширяется
        if (str == null) {
            return appendNull();
        }
        
        int len = str.length();
        ensureCapacityInternal(count + len);
        
        // Копируем символы из str в буфер
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
}

Сравнение производительности

Пример 1: Конкатенация в цикле

// НЕЭФФЕКТИВНО - String
String result = "";
for (int i = 0; i < 10000; i++) {
    result = result + i; // Создается 10000 новых объектов!
}
// Время выполнения: 500 ms
// Использование памяти: огромное

// ЭФФЕКТИВНО - StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append(i); // Расширение одного буфера
}
String result = sb.toString();
// Время выполнения: 1 ms
// Использование памяти: минимальное

Пример 2: Список чисел

// С String
String list = "";
for (int i = 0; i < 100; i++) {
    list = list + i + ",";
}
// Создается 200 объектов String! (число + запятая = 2 операции)

// С StringBuilder
StringBuilder list = new StringBuilder();
for (int i = 0; i < 100; i++) {
    if (i > 0) list.append(",");
    list.append(i);
}
String result = list.toString();
// Создается только 1 объект StringBuilder

Основные методы StringBuilder

StringBuilder sb = new StringBuilder("Hello");

// append - добавить в конец
sb.append(" World");
sb.append(123);
sb.append(true);
// Результат: "Hello World123true"

// insert - вставить в позицию
sb.insert(5, "Beautiful ");
// Результат: "HelloBeautiful World123true"

// delete - удалить часть
sb.delete(0, 5); // удалить с 0 по 5
// Результат: "Beautiful World123true"

// deleteCharAt - удалить один символ
sb.deleteCharAt(0); // удалить первый символ
// Результат: "eautiful World123true"

// replace - заменить часть
sb.replace(0, 4, "XXX");
// Результат: "XXXtiful World123true"

// reverse - развернуть
sb.reverse();
// Результат: "eurt321dlroW lufituXXX"

// toString - преобразовать в String
String result = sb.toString();

// length - получить длину
int len = sb.length();

// capacity - получить емкость буфера
int cap = sb.capacity();

Отличие StringBuilder и StringBuffer

// StringBuilder - не потокобезопасен (быстрее)
StringBuilder sb = new StringBuilder();
sb.append("Not thread-safe");

// StringBuffer - потокобезопасен (медленнее)
StringBuffer sb = new StringBuffer();
sb.append("Thread-safe");

StringBuilder — используйте в однопоточном коде (почти везде). StringBuffer — используйте только если строка передается между потоками (редко).

Оптимальное использование

// Пример: построить HTML
public String buildHTML(List<Item> items) {
    StringBuilder html = new StringBuilder();
    
    html.append("<ul>");
    for (Item item : items) {
        html.append("  <li>");
        html.append(escapeHtml(item.getName()));
        html.append("</li>");
    }
    html.append("</ul>");
    
    return html.toString();
}

Производительность с разной емкостью

// Если вы знаете примерный размер, укажите capacity
StringBuilder sb = new StringBuilder(1000); // Начальная емкость 1000
sb.append("..."); // Не будет пересчитывать емкость

// Без указания capacity (по умолчанию 16)
StringBuilder sb2 = new StringBuilder(); // capacity = 16
sb2.append("..."); // При превышении 16 символов буфер расширится

Когда буфер расширяется, новая емкость вычисляется как:

new_capacity = (old_capacity * 2) + 2

Основные методы

  • append(x): Добавить в конец (sb.append("text"))
  • insert(index, x): Вставить в позицию (sb.insert(0, "Hello"))
  • delete(start, end): Удалить диапазон (sb.delete(0, 5))
  • deleteCharAt(index): Удалить символ (sb.deleteCharAt(0))
  • replace(start, end, str): Заменить часть (sb.replace(0, 5, "Hi"))
  • reverse(): Развернуть (sb.reverse())
  • toString(): В строку (String s = sb.toString())
  • length(): Длина (int len = sb.length())
  • capacity(): Емкость буфера (int cap = sb.capacity())

Когда использовать StringBuilder

Используйте StringBuilder когда:

  • Конкатенируете строки в цикле
  • Строите большие тексты (HTML, JSON, SQL)
  • Модифицируете строку много раз
  • Производительность критична

Не используйте StringBuilder когда:

  • Конкатенируете всего несколько строк
  • Это одноразовая операция
  • Нет проблем с производительностью
// Вот так нормально (несколько конкатенаций)
String greeting = "Hello, " + name + "! Welcome to " + siteName + "!";

// А это уже стоит делать в StringBuilder (много операций)
StringBuilder query = new StringBuilder();
query.append("SELECT * FROM users WHERE ");
query.append("age > ").append(minAge).append(" AND ");
query.append("city = '").append(city).append("'");
String sql = query.toString();

Сравнение String и StringBuilder

АспектStringStringBuilder
ИзменяемостьНеизменяемИзменяем
ПроизводительностьМедленно (много объектов)Быстро (один объект)
ПамятьМногоМало
ПотокобезопасностьДаНет
ИспользованиеХранение, передачаПостроение, модификация

Вывод

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