Что значит создание строк в StringBuilder?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что значит создание строк в StringBuilder?
StringBuilder — это класс в Java, который предназначен для эффективного построения строк. В отличие от String, который является неизменяемым (immutable), StringBuilder позволяет модифицировать содержимое строки без создания новых объектов в памяти.
Строки (String) — неизменяемы
Сначала поймем проблему с обычными строками:
String str = "Hello";
str = str + " World"; // На самом деле создается новый объект!
Что происходит под капотом:
- Создается первый объект String: "Hello"
- При конкатенации (+) создается новый объект String: "Hello World"
- Старый объект "Hello" становится мусором и удаляется garbage collector'ом
Это экономически неэффективно, если нужно много раз конкатенировать строки.
StringBuilder — эффективное решение
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
В этом случае:
- Создается один объект StringBuilder
- Каждый вызов append() расширяет внутренний буфер символов
- Не создается новых объектов String при каждой операции
- Только при вызове 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
| Аспект | String | StringBuilder |
|---|---|---|
| Изменяемость | Неизменяем | Изменяем |
| Производительность | Медленно (много объектов) | Быстро (один объект) |
| Память | Много | Мало |
| Потокобезопасность | Да | Нет |
| Использование | Хранение, передача | Построение, модификация |
Вывод
StringBuilder — это класс для эффективного построения строк путем многократного добавления, вставки или замены символов. Вместо создания новых объектов String при каждой операции, StringBuilder работает с одним внутренним буфером символов, что экономит память и время. Если вы строите строки в цикле или сохраняете большие тексты, всегда используйте StringBuilder. Это может улучшить производительность в сотни раз.