0Pricing
Java Academy · Урок

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 created

API 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.",30

StringJoiner для вывода с разделителями

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 — локальная установка не требуется.

Все уроки этого курса

  1. Неизменяемость String и пул строк
  2. StringBuilder для эффективного объединения
  3. Текстовые блоки и String.format
  4. Регулярные выражения с Pattern и Matcher
← Назад к Java Academy