— Приветствую, Амиго!

— Здравствуй, Риша!

— Ты уже достаточно знаешь о строках, чтобы изучить кое-что интересное. А именно — новый класс, который как String, но не совсем.

— Звучит интригующе, хоть и не вполне понятно, чем плохи обычные строки и зачем нужны ещё какие-то.

— Начнём с того, что строки в Java — объекты неизменяемые (immutable).

— Это как? Я забыл… Или даже не знал…

— Напомню, неизменяемые объекты — те, состояния которых нельзя изменить после их создания.

— Ага… А почему строки в Java неизменяемые?

— Так было сделано для того, чтобы класс-строку можно было сильно оптимизировать и использовать повсеместно. Например, в качестве ключей у коллекции HashMap рекомендуется использовать только immutable-типы.

— Однако часто возникают ситуации, когда программисту все же было бы удобнее иметь String-класс, который можно менять. Который не создает новую подстроку при каждом вызове его метода.

— А для чего это может понадобиться?

— Например, у нас есть очень большая строка и мы часто дописываем что-то в ее конец. В этом случае даже коллекция символов (ArrayList<Character>) может быть эффективнее, чем постоянное пересоздание строк и конкатенации объектов типа String.

— Поэтому и понадобились строки, которые не совсем String?

— Именно так. В язык Java добавили тип строк, который можно менять. Называется он StringBuilder.

Создание объекта

— Чтобы создать объект StringBuilder на основе существующей строки, нужно выполнить команду вида:

StringBuilder имя = new StringBuilder(строка);

— Чтобы создать пустую изменяемую строку, нужно воспользоваться командой вида:

StringBuilder имя = new StringBuilder();

Список методов

— Класс StringBuilder имеет два десятка полезных методов, вот самые важные из них:

Метод Описание
StringBuilder append(obj)
Преобразовывает переданный объект в строку и добавляет к текущей строке
StringBuilder insert(int index, obj)
Преобразовывает переданный объект в строку и вставляет в текущую строку
StringBuilder replace(int start, int end, String str)
Заменяет часть строки, заданную интервалом start..end на переданную строку
StringBuilder deleteCharAt(int index)
Удаляет из строки символ под номером index
StringBuilder delete(int start, int end)
Удаляет из строки символы, заданные интервалом
int indexOf(String str, int index)
Ищет подстроку в текущей строке
int lastIndexOf(String str, int index)
Ищет подстроку в текущей строке с конца
char charAt(int index)
Возвращает символ строки по его индексу
String substring(int start, int end)
Возвращает подстроку, заданную интервалом
StringBuilder reverse()
Разворачивает строку задом наперед.
void setCharAt(int index, char)
Изменяет символ строки, заданный индексом на переданный
int length()
Возвращает длину строки в символах

— А теперь я кратко опишу тебе каждый из этих методов.

Добавление к строке

— Чтобы что-то добавить к изменяемой строке (StringBuilder), нужно воспользоваться методом append(). Пример:

Код Описание
StringBuilder builder = new StringBuilder("Привет");
builder.append("Пока");
builder.append(123);
Привет
ПриветПока
ПриветПока123

Преобразование к стандартной строке

— Чтобы преобразовать объект StringBuilder к строке типа String, нужно просто вызвать у него метод toString(). Пример

Код Вывод на экран
StringBuilder builder = new StringBuilder("Привет");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Привет123

Как удалить символ?

— Чтобы удалить символ в изменяемой строке, вам нужно воспользоваться методом deleteCharAt(). Пример:

Код Вывод на экран
StringBuilder builder = new StringBuilder("Привет");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Првет

Как заменить часть строки на другую?

— Для этого есть метод replace(int begin, int end, String str). Пример:

Код Вывод на экран
StringBuilder builder = new StringBuilder("Привет");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
ПрHello!т
9
Задача
Java Syntax Pro Beta,  9 уровень7 лекция
Недоступна
Логические операторы
Внеси исправления в метод taskForCondition(), чтобы он выводил в консоли число 30. Изменять можно только логические операторы: && на & и || на |.

— Звучит удобно. Спасибо, Риша.

— Не стоит благодарности. Лучше подумай, можешь ли ты развернуть строку задом наперёд и как бы ты это делал?

— Ну.. Создал бы StringBuilder, поместил бы в неё строку… Затем создал бы новую строку, и циклом прогнал бы с последнего элемента по первый… Или Побитовый сдвиг…

— Неплохо. Но можно и быстрее. Для этой операции есть специальный метод — reverse(); Пример:

Код Вывод на экран
String str = "Привет";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
тевирП

— Кроме класса StringBuilder в Java есть ещё один строкоподобный класс — StringBuffer. Это аналог класса StringBuilder, только его методы имеют модификатор synchronized.

— Что это значит?

— А это значит, что к объекту StringBuffer можно одновременно обращаться из нескольких потоков.

— Я пока не очень знаком с потоками. Но “умеет работать с несколькими потоками” — это явно лучше, чем “не умеет работать с несколькими потоками”. Почему в таком случае не использовать StringBuffer всегда?

— Потому что он работает гораздо медленнее, чем StringBuilder. Такой класс может тебе понадобиться, когда ты начнешь активно изучать многопоточность в квесте Java Multithreading.

— Запишу себе в память, чтобы не забыть. С пометкой “на будущее”.

9
Задача
Java Syntax Pro Beta,  9 уровень7 лекция
Недоступна
Приоритеты
Внеси исправления в метод main(), чтобы он выводил в консоли число 12.