Освой Java играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Классы StringBuffer и StringBuilder

Класс String представляет собой неизменяемые последовательности символов постоянной длины и частое использование объектов класса занимают много места в памяти. Класс StringBuffer представляет расширяемые и доступные для изменений последовательности символов, позволяя вставлять символы и подстроки в существующую строку и в любом месте. Данный класс гораздо экономичнее в плане потребления памяти и настоятельно рекомендуется к использованию.

Существует четыре конструктора класса:

  1. StringBuffer() - резервирует место под 16 символов без перераспределения памяти
  2. StringBuffer(int capacity) - явно устанавливает размер буфера
  3. StringBuffer(String string) - устанавливает начальное содержимое и резервирует 16 символов без повторого резервирования
  4. StringBuffer(CharSequence cs) - создаёт объект, содержащий последовательность символов и резервирует место ещё под 16 символов

Методы класса StringBuffer

length()

Метод позволяет получить текущую длину объекта.


StringBuffer sb = new StringBuffer("Котэ");
mInfoTextView.setText("Длина: " + sb.length());

capacity()

Метод позволяет получить текущий объём выделенной памяти.


StringBuffer sb = new StringBuffer("Котэ");
mInfoTextView.setText("Объём памяти: " + sb.capacity()); // вернёт 20

Обратите внимание, что хотя слово состоит из четырёх символов, в памяти выделено запасное пространство для дополнительных 16 символов. Для такой простейшей операции выигрыша нет, но в сложных примерах, когда приходится на лету соединять множество строк, производительность резко возрастает.

ensureCapacity()

Можно предварительно выделить место для определённого количества символов, если собираетесь добавлять большое количество маленьких строк.

setLength(int length)

Устанавливает длину строки. Значение должно быть неотрицательным.

charAt(int index) и setCharAt(int index, char ch)

Можно извлечь значение отдельного символа с помощью метода charAt() и установить новое значение символа с помощью метода setCharAt(), указав индекс символа и его значение.


StringBuffer sb = new StringBuffer("Кит");
sb.setCharAt(1, 'o');
mInfoTextView.setText(sb.toString());

getChars()

Позволяет скопировать подстроку из объекта класса StringBuffer в массив. Необходимо позаботиться, чтобы массив был достаточного размера для приёма нужного количества символов указанной подстроки.

append()

Метод соединяет представление любого другого типа данных. Есть несколько перегруженных версий.

StringBuffer append(String string)
StringBuffer append(int number)
StringBuffer append(Object object)

Строковое представление каждого параметра за кулисами получают через метод String.valueOf() и затем полученные строки склеиваются в итоговую строку.


String str1 = "У кота ";
String str2 = " лапы";
int paws = 4;
StringBuffer sb = new StringBuffer(20);
sb.append(str1).append(paws).append(str2);
mInfoTextView.setText(sb.toString());

insert()

Вставляет одну строку в другую. Также можно вставлять значения других типов, которые будут автоматически преобразованы в строки. Вам надо указать индекс позиции, куда будет вставляться строка.


StringBuffer sb = new StringBuffer("Я Котов");
sb.insert(2, "Люблю ");
mInfoTextView.setText(sb.toString());

reverse()

Позволяет изменить порядок символов на обратный.


StringBuffer sb = new StringBuffer("МОКНЕТ ОКСАНА С КОТЕНКОМ");
sb.reverse();
mInfoTextView.setText(sb.toString());

У меня получилось практически то же самое, может метод глючит?

delete() и deleteCharAt()

Метод delete() удаляет последовательность символов, вам надо задать индекс первого символа, который надо удалить, а также индекс символа, следующего за последним из удаляемых. Метод deleteCharAt() удаляет один символ из указанной позиции.

replace()

Позволяет заменить один набор символов на другой. Нужно указать начальный и конечный индекс и строку замены.

substring()

Позволяет получить часть содержимого. Есть две формы метода. В первом случае нужно указать индекс начала позиции, с которой нужно получить подстроку. Во втором варианте указывается начальный индекс и конечный индекс, если нужно получить текст из середины строки.

Есть и другие методы

StringBuilder

Класс StringBuilder идентичен классу StringBuffer и обладает большей производительностью. Однако он не синхронизирован, поэтому его не нужно использовать в тех случаях, когда к изменяемой строке обращаются несколько потоков.

Создадим новый объект.


StringBuilder builder = new StringBuilder();

Добавляем новый фрагмент в существующую строку:


builder.append(ch); // можно добавить один символ
builder.append(sometext); // а можно добавить готовую строку
String completedString = builder.toString(); // результирующая строка

Соединять строки можно цепочкой.


new StringBuilder().append(s1).append(s2).append(s3).toString();

Данный код работает чуть быстрее, чем вызов append() по отдельности. Но это будет заметно при очень больших объёмах.

Реклама