— Приветствую, Амиго!
— Здравствуй, Риша!
— Ты уже достаточно знаешь о строках, чтобы изучить кое-что интересное. А именно — новый класс, который как String, но не совсем.
— Звучит интригующе, хоть и не вполне понятно, чем плохи обычные строки и зачем нужны ещё какие-то.
— Начнём с того, что строки в Java — объекты неизменяемые (immutable).
— Это как? Я забыл… Или даже не знал…
— Напомню, неизменяемые объекты — те, состояния которых нельзя изменить после их создания.
— Ага… А почему строки в Java неизменяемые?
— Так было сделано для того, чтобы класс-строку можно было сильно оптимизировать и использовать повсеместно. Например, в качестве ключей у коллекции HashMap рекомендуется использовать только immutable-типы.
— Однако часто возникают ситуации, когда программисту все же было бы удобнее иметь String-класс, который можно менять. Который не создает новую подстроку при каждом вызове его метода.
— А для чего это может понадобиться?
— Например, у нас есть очень большая строка и мы часто дописываем что-то в ее конец. В этом случае даже коллекция символов (ArrayList<Character>
) может быть эффективнее, чем постоянное пересоздание строк и конкатенации объектов типа String.
— Поэтому и понадобились строки, которые не совсем String?
— Именно так. В язык Java добавили тип строк, который можно менять. Называется он StringBuilder
.
Создание объекта
— Чтобы создать объект StringBuilder
на основе существующей строки, нужно выполнить команду вида:
StringBuilder имя = new StringBuilder(строка);
— Чтобы создать пустую изменяемую строку, нужно воспользоваться командой вида:
StringBuilder имя = new StringBuilder();
Список методов
— Класс StringBuilder
имеет два десятка полезных методов, вот самые важные из них:
Метод | Описание |
---|---|
|
Преобразовывает переданный объект в строку и добавляет к текущей строке |
|
Преобразовывает переданный объект в строку и вставляет в текущую строку |
|
Заменяет часть строки, заданную интервалом start..end на переданную строку |
|
Удаляет из строки символ под номером index |
|
Удаляет из строки символы, заданные интервалом |
|
Ищет подстроку в текущей строке |
|
Ищет подстроку в текущей строке с конца |
|
Возвращает символ строки по его индексу |
|
Возвращает подстроку, заданную интервалом |
|
Разворачивает строку задом наперед. |
|
Изменяет символ строки, заданный индексом на переданный |
|
Возвращает длину строки в символах |
— А теперь я кратко опишу тебе каждый из этих методов.
Добавление к строке
— Чтобы что-то добавить к изменяемой строке (StringBuilder
), нужно воспользоваться методом append()
. Пример:
Код | Описание |
---|---|
|
Привет |
Преобразование к стандартной строке
— Чтобы преобразовать объект StringBuilder
к строке типа String, нужно просто вызвать у него метод toString()
. Пример
Код | Вывод на экран |
---|---|
|
Привет123 |
Как удалить символ?
— Чтобы удалить символ в изменяемой строке, вам нужно воспользоваться методом deleteCharAt()
. Пример:
Код | Вывод на экран |
---|---|
|
Првет |
Как заменить часть строки на другую?
— Для этого есть метод replace(int begin, int end, String str)
. Пример:
Код | Вывод на экран |
---|---|
|
ПрHello!т |
— Звучит удобно. Спасибо, Риша.
— Не стоит благодарности. Лучше подумай, можешь ли ты развернуть строку задом наперёд и как бы ты это делал?
— Ну.. Создал бы StringBuilder
, поместил бы в неё строку… Затем создал бы новую строку, и циклом прогнал бы с последнего элемента по первый… Или Побитовый сдвиг…
— Неплохо. Но можно и быстрее. Для этой операции есть специальный метод — reverse();
Пример:
Код | Вывод на экран |
---|---|
|
тевирП |
— Кроме класса StringBuilder
в Java есть ещё один строкоподобный класс — StringBuffer
. Это аналог класса StringBuilder
, только его методы имеют модификатор synchronized
.
— Что это значит?
— А это значит, что к объекту StringBuffer
можно одновременно обращаться из нескольких потоков.
— Я пока не очень знаком с потоками. Но “умеет работать с несколькими потоками” — это явно лучше, чем “не умеет работать с несколькими потоками”. Почему в таком случае не использовать StringBuffer
всегда?
— Потому что он работает гораздо медленнее, чем StringBuilder
. Такой класс может тебе понадобиться, когда ты начнешь активно изучать многопоточность в квесте Java Multithreading.
— Запишу себе в память, чтобы не забыть. С пометкой “на будущее”.