StringBuilder для эффективного объединения
Используйте StringBuilder для эффективного создания строк внутри циклов и при сложном форматировании.
«StringBuilder для эффективного объединения» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
StringBuilder для эффективной конкатенации
StringBuilder — изменяемая альтернатива String для поэтапного создания текста. Он позволяет не создавать множество промежуточных объектов String.
StringBuilder и конкатенация String
При конкатенации множества строк, особенно в циклах, StringBuilder значительно быстрее, поскольку изменяет внутренний буфер char, а не создаёт новые объекты.
// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
result += i + ","; // 1000 new String objects!
}
// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String createdAPI StringBuilder
Основные методы: append, insert, delete, replace, reverse, toString, длина, charAt, setCharAt.
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World"); // Hello, World
sb.insert(5, "!"); // Hello!, World
sb.delete(5, 6); // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse(); // avaJ ,olleH
sb.reverse(); // Hello, Java
System.out.println(sb); // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // HЦепочки вызовов append
Все методы append и другие изменяющие методы возвращают this, что позволяет создавать цепочки вызовов.
StringBuilder html = new StringBuilder()
.append("<div class=\"card\">")
.append("<h2>").append("Product Title").append("</h2>")
.append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
.append("<button>Add to Cart</button>")
.append("</div>");
System.out.println(html.toString());Начальная ёмкость
Заранее задайте для StringBuilder ожидаемую ёмкость, чтобы избежать изменения размера внутреннего массива и повысить производительность при работе с большими строками.
// Default capacity: 16 chars
StringBuilder small = new StringBuilder();
// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);
for (int i = 1; i <= 10; i++) {
report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}
System.out.println(report.toString().substring(0, 30));
// " 1. Record 0001: processed OK"deleteCharAt и удаление отдельных частей
deleteCharAt удаляет один символ. delete(start, end) удаляет диапазон. Эти операции имеют сложность O(n), поскольку требуют сдвига элементов массива.
StringBuilder sb = new StringBuilder("Hello, World!");
sb.deleteCharAt(5); // removes comma: "Hello World!"
sb.delete(5, 6); // removes space: "HelloWorld!"
System.out.println(sb); // HelloWorld!
// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!Создание CSV
Практический шаблон: создание строки CSV с помощью StringBuilder и корректная обработка разделителей.
import java.util.List;
static String toCsv(List<String> values) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < values.size(); i++) {
if (i > 0) sb.append(',');
sb.append(escapeCsv(values.get(i)));
}
return sb.toString();
}
static String escapeCsv(String s) {
if (s.contains(",") || s.contains("\""))
return "\"" + s.replace("\"", "\"\"") + "\"";
return s;
}
System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30StringJoiner для вывода с разделителями
StringJoiner упрощает объединение элементов с помощью разделителя, необязательного префикса и суффикса — вручную обрабатывать разделители не требуется.
import java.util.StringJoiner;
StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]
// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie
// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
.collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)StringBuilder и StringBuffer
StringBuffer — потокобезопасная синхронизированная версия StringBuilder. Она работает медленнее из-за блокировок. В однопоточных контекстах используйте StringBuilder (в 99% случаев).
// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");
// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");
// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharingРазворот строки и проверка на палиндром
Встроенный метод reverse() в StringBuilder делает проверку на палиндром элегантной.
static boolean isPalindrome(String s) {
String cleaned = s.toLowerCase()
.replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
String reversed = new StringBuilder(cleaned).reverse().toString();
return cleaned.equals(reversed);
}
System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car")); // false
System.out.println(isPalindrome("Was it a car or a cat I saw?")); // trueПрактический пример: построитель SQL-запросов
Создание динамического SQL-запроса с помощью StringBuilder, где условия WHERE добавляются при необходимости.
static String buildQuery(String category, Double minPrice, Double maxPrice) {
StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
if (category != null)
sql.append(" AND category = '" + category + "'");
if (minPrice != null)
sql.append(" AND price >= ").append(minPrice);
if (maxPrice != null)
sql.append(" AND price <= ").append(maxPrice);
sql.append(" ORDER BY name");
return sql.toString();
}
System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY nameБыстрая проверка
Почему конкатенация строк с помощью + неэффективна в циклах?
Итоги: StringBuilder для эффективной конкатенации
Главные выводы:
- StringBuilder изменяем — append/insert/delete изменяют внутренний буфер
- Используйте StringBuilder в циклах, чтобы избежать создания строк со сложностью O(n²)
- Все изменяющие методы возвращают this, что позволяет создавать цепочки вызовов
- Заранее задавайте для StringBuilder ожидаемую ёмкость, чтобы уменьшить число изменений внутреннего размера
- StringJoiner и String.join удобны для вывода элементов, разделённых разделителями
- StringBuffer — синхронизированная (потокобезопасная), но более медленная альтернатива
Часто задаваемые вопросы
Урок «StringBuilder для эффективного объединения» бесплатный?
Да — полный текст урока «StringBuilder для эффективного объединения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «StringBuilder для эффективного объединения»?
Используйте StringBuilder для эффективного создания строк внутри циклов и при сложном форматировании. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «StringBuilder для эффективного объединения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Неизменяемость String и пул строк
- StringBuilder для эффективного объединения
- Текстовые блоки и String.format
- Регулярные выражения с Pattern и Matcher