StringBuilder и StringBuffer
Компромиссы потокобезопасности
«StringBuilder и StringBuffer» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Два изменяемых класса
В Java есть два изменяемых класса строк: StringBuilder и StringBuffer. Их интерфейсы почти идентичны, но они различаются одним важным свойством: потокобезопасностью.
Одинаковый интерфейс
Оба класса предоставляют append, insert, delete, reverse и остальные методы. Код, использующий один из них, обычно можно переключить на другой, изменив только имя типа.
public class Main {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append(", ").append("World");
System.out.println(sb);
}
}StringBuffer синхронизирован
Методы StringBuffer являются синхронизированными, то есть несколько потоков могут безопасно изменять один и тот же экземпляр. За эту безопасность приходится платить небольшой потерей производительности.
public class Main {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("thread-safe");
buffer.append("!");
System.out.println(buffer);
}
}StringBuilder не синхронизирован
StringBuilder не выполняет синхронизацию, поэтому он быстрее. Компромисс заключается в том, что один экземпляр нельзя безопасно использовать в нескольких потоках без внешней координации.
public class Main {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("fast");
builder.append("!");
System.out.println(builder);
}
}Когда использовать StringBuilder
Используйте StringBuilder в обычном случае: при построении строк внутри одного метода или потока. Это выбор по умолчанию почти для любого повседневного кода.
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append("#");
}
System.out.println(sb);
}
}Когда использовать StringBuffer
Используйте StringBuffer только тогда, когда один и тот же экземпляр построителя действительно совместно используется и изменяется несколькими потоками. На практике такое встречается редко.
public class Main {
public static void main(String[] args) {
StringBuffer shared = new StringBuffer("log: ");
shared.append("event A; ");
shared.append("event B");
System.out.println(shared);
}
}Локальные переменные не являются общими
Построитель, объявленный и используемый только внутри одного метода, никогда не виден другим потокам, поэтому StringBuilder в таком случае всегда подходит. Отсутствие синхронизации не может привести к проблемам.
public class Main {
static String build() {
StringBuilder sb = new StringBuilder();
sb.append("local only");
return sb.toString();
}
public static void main(String[] args) {
System.out.println(build());
}
}Разница в производительности
Накладные расходы на синхронизацию в StringBuffer делают его медленнее при однопоточном использовании. В часто выполняемых циклах StringBuilder работает лучше.
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append('x');
}
System.out.println("Built length: " + sb.length());
}
}Историческая справка
StringBuffer появился первым, ещё в ранних версиях Java. StringBuilder добавили в Java 5 как более быструю несинхронизированную альтернативу для распространённого однопоточного случая.
Правильный выбор
По умолчанию выбирайте StringBuilder. Переходите на StringBuffer, только если можете доказать, что один экземпляр используется несколькими потоками. Иначе Вы платите за безопасность, которая Вам не нужна.
public class Main {
public static void main(String[] args) {
StringBuilder result = new StringBuilder();
result.append("Use StringBuilder ").append("by default");
System.out.println(result);
}
}Оба преобразуются в String
Оба класса создают неизменяемый объект String с помощью toString(). Выбор между ними влияет только на построение строки, но не на итоговый результат.
public class Main {
public static void main(String[] args) {
String a = new StringBuilder("one").toString();
String b = new StringBuffer("two").toString();
System.out.println(a + " " + b);
}
}Быстрая проверка
В чём состоит главное различие между StringBuilder и StringBuffer?
Итоги
Вы узнали о компромиссах:
- У обоих почти одинаковые программные интерфейсы
StringBufferсинхронизирован (потокобезопасен, но медленнее)StringBuilderне синхронизирован (зато быстрее)- Для построения строк в одном потоке по умолчанию выбирайте
StringBuilder - Используйте
StringBufferтолько для экземпляров, действительно общих для нескольких потоков
Часто задаваемые вопросы
Урок «StringBuilder и StringBuffer» бесплатный?
Да — полный текст урока «StringBuilder и StringBuffer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «StringBuilder и StringBuffer»?
Компромиссы потокобезопасности Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «StringBuilder и StringBuffer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему строки неизменяемы
- Создание строк с помощью StringBuilder
- Методы StringBuilder
- StringBuilder и StringBuffer