StringBuilder

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

Класс хранит символы во внутреннем массиве, который автоматически расширяется при необходимости. StringBuilder не является потокобезопасным — если нужна синхронизация между потоками, используйте StringBuffer.

Зачем нужен

  • Эффективное построение длинных строк в циклах (без создания тысяч промежуточных объектов).

  • Конкатенация большого количества фрагментов работает в разы быстрее, чем оператор + с обычными String.

  • Удобные методы для вставки, удаления, замены и реверса фрагментов.

Конструкторы

  • StringBuilder() — пустой буфер ёмкостью 16 символов.

  • StringBuilder(int capacity) — пустой буфер заданной начальной ёмкости.

  • StringBuilder(String str) — буфер с начальным содержимым из строки.

  • StringBuilder(CharSequence seq) — буфер из любой последовательности символов.

Популярные методы

  • append(x) — добавить значение в конец (есть перегрузки для всех примитивов и объектов).

  • insert(int offset, x) — вставить значение в указанную позицию.

  • delete(int start, int end) — удалить символы в диапазоне [start, end).

  • deleteCharAt(int index) — удалить один символ.

  • replace(int start, int end, String str) — заменить диапазон новой строкой.

  • reverse() — перевернуть содержимое.

  • length() — текущая длина в символах.

  • charAt(int index) / setCharAt(int index, char c) — чтение и запись символа.

  • toString() — получить готовую String.

  • substring(int start[, int end]) — извлечь подстроку.

  • indexOf(String str) — найти позицию подстроки.

Пример 1. Построение строки в цикле

public class BuildString {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 5; i++) {
            sb.append("№").append(i).append(" ");
        }
        System.out.println(sb.toString().trim());
    }
}

Вывод:

№1 №2 №3 №4 №5

Пример 2. Цепочка вызовов

public class Chain {
    public static void main(String[] args) {
        String result = new StringBuilder("Alash")
                .append("Ed")
                .append(" ")
                .append("Wiki")
                .toString();
        System.out.println(result);
    }
}

Вывод:

AlashEd Wiki

Пример 3. Вставка и удаление

public class InsertDelete {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Arduino Uno");
        sb.insert(8, "R3 ");
        System.out.println(sb);
        sb.delete(0, 8);
        System.out.println(sb);
    }
}

Вывод:

Arduino R3 Uno
R3 Uno

Пример 4. Замена и реверс

public class ReplaceReverse {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Robot Phobo");
        sb.replace(0, 5, "Mini");
        System.out.println(sb);
        sb.reverse();
        System.out.println(sb);
    }
}

Вывод:

Mini Phobo
obohP iniM

Пример 5. Чтение и изменение символов

public class CharOps {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("ESP32");
        System.out.println("Символ 0: " + sb.charAt(0));
        sb.setCharAt(0, 'X');
        System.out.println(sb);
        System.out.println("Длина: " + sb.length());
    }
}

Вывод:

Символ 0: E
XSP32
Длина: 5

Пример 6. Сравнение скорости с конкатенацией String

public class Speed {
    public static void main(String[] args) {
        int n = 50_000;

        long t1 = System.nanoTime();
        String s = "";
        for (int i = 0; i < n; i++) s += "x";
        long stringMs = (System.nanoTime() - t1) / 1_000_000;

        long t2 = System.nanoTime();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) sb.append('x');
        long sbMs = (System.nanoTime() - t2) / 1_000_000;

        System.out.println("String:        " + stringMs + " ms");
        System.out.println("StringBuilder: " + sbMs + " ms");
    }
}

Вывод (примерные значения):

String:        650 ms
StringBuilder: 2 ms

Пример 7. Поиск и подстрока

public class FindSubstring {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("voltage=5V current=200mA");
        int idx = sb.indexOf("current");
        System.out.println("Позиция: " + idx);
        System.out.println("Подстрока: " + sb.substring(idx));
    }
}

Вывод:

Позиция: 10
Подстрока: current=200mA

Пример 8. Сборка CSV-строки

public class CsvBuilder {
    public static void main(String[] args) {
        String[] sensors = {"line_L", "line_C", "line_R"};
        int[] values = {512, 480, 600};

        StringBuilder csv = new StringBuilder();
        for (int i = 0; i < sensors.length; i++) {
            if (i > 0) csv.append(",");
            csv.append(sensors[i]).append("=").append(values[i]);
        }
        System.out.println(csv);
    }
}

Вывод:

line_L=512,line_C=480,line_R=600

См. также

Примечание

Описание основано на официальной документации Oracle Java SE 21 API (https://docs.oracle.com/en/java/javase/21/docs/api/). Материал распространяется на условиях Oracle Free Documentation License. Тексты на этой странице написаны редакцией AlashEd своими словами; примеры кода — авторские.