Изменение текстовых строк
Как уже неоднократно отмечалось, объекты класса String не могут изменяться. Однако могут изменяться ссылки на эти объекты. Поэтому если необходимо изменить текст, связанный с какой-то текстовой переменной (объектной переменной класса String), то, во-первых, создается новый объект класса String с нужными свойствами, во-вторых, значение объектной переменной меняется так, чтобы она ссылалась на этот объект. Есть еще один способ изменения текстовых строк. Заключается он в использовании объектов класса StringBuffer, но об этом рассказывается несколько позже.
В табл. 1 представлены некоторые методы, полезные при внесении изменений в текстовые строки.
Таблица1.Методы для внесения изменений в текстовые строки
Метод | Назначение |
substring() | Методом substring()возвращается в качестве результата тексто-вая подстрока (объект класса String) строки, из которой вызывается метод. Аргументами метода указывают индекс начала подстроки в строке и индекс первого не входящего в подстроку символа строки. Можно указывать только первый аргумент |
concat() | Методом concat()выполняется объединение строк: текстовая строка, указанная аргументом метода, добавляется в конец текстовой строки, из которой вызывается метод. Получаемый в результате объединения текстовый объект класса String, возвращается в качестве результата метода |
replace() | У метода replace()два аргумента символьного (char) типа. В качестве результата методом возвращается текстовая строка, которая получается заменой в строке вызова первого символа-аргумента вторым |
Метод | Назначение |
trim() | Результатом метода trim()является текстовый объект, который получается из строки вызова удалением начальных и конечных пробелов. Метод не имеет аргументов |
toLowerCase() | Методом toLowerCase()в качестве результата возвращается текстовая строка (объект класса String), которая получается из строки вызова переводом всех букв в нижний регистр (все буквы строчные). Метод аргументов не имеет |
toUpperCase() | Методом toUpperCase()в качестве результата возвращается текстовая строка (объект класса String), которая получается из строки вызова переводом всех букв в верхний регистр (все буквы прописные). Метод аргументов не имеет |
Примеры внесения изменений в текстовые строки приведены в программе из листинга 7.
Листинг 7.Изменение текстовых строк
class StringReplace{
public static void main(String args[]){
String str="Мы программируем на С++";
String s,s1,s2,s3,s4;
// Извлечение подстроки:
s=str.substring(3,21);
System.out.println(s);
// Объединение строк:
s1=str.concat(" и Java");
System.out.println(s1);
// Замена символов:
s2=s1.replace(' ','_');
System.out.println(s2);
// Перевод в нижний регистр:
s3=s1.toLowerCase();
System.out.println(s3);
// Перевод в верхний регистр:
s4=s1.toUpperCase();
System.out.println(s4);
}}
В результате выполнения этой программы получаем такую последовательность сообщений:
программируем на С
Мы программируем на С++ и Java
Мы_программируем_на_С++_и_Java
мы программируем на с++ и java
МЫ ПРОГРАММИРУЕМ НА С++ И JAVA
Рассмотрим представленный программный код более детально и проанализируем результат его выполнения. В главном методе создается строка str со значением:
"Мы программируем на С++"
Кроме того, объявляются еще пять объектных переменных типа String. Командой s=str.substring(3,21) из строки str извлекается подстрока с 4-го по 21-й символы включительно, и результат (строка "программируем на С") записывается в переменную s. Значение этой переменной выводится на экран.
Строка s1 получается объединением строки str и текстового литерала " и Java" — для этого использована команда:
s1=str.concat(" и Java")
В результате после вывода строки s1 на экран мы получаем сообщение:
Мы программируем на С++ и Java
Команда s2=s1.replace(' ','_') означает, что строка s2 получается из строки s1 заменой всех пробелов символами подчеркивания. При выводе строки s2 на экран получаем:
Мы_программируем_на_С++_и_Java
С помощью команды s3=s1.toLowerCase() формируется строка s3, состоящая из строчных символов строки s1. Аналогично командой s4=s1.toUpperCase() создаем строку, состоящую из прописных символов строки s1. При выводе строк s3 и s4 на экран получаем соответственно сообщения:
мы программируем на с++ и java
МЫ ПРОГРАММИРУЕМ НА С++ И JAVA
Класс StringBuffer
Текстовые строки могут быть реализованы не только как объекты класса String, но и как объекты класса StringBuffer. Принципиальное отличие этих объектов состоит в том, что объекты класса StringBuffer можно изменять. Другими словами, если текст реализован в виде объекта класса StringBuffer, в этот текст можно вносить изменения, причем без создания нового объекта. В частности, при работе с объектами класса StringBuffer можно добавлять подстроки в средину и конец строки. Делается это за счет выделения дополнительной памяти при создании объекта класса StringBuffer.
У класса StringBuffer несколько конструкторов, среди которых можно выделить конструктор без аргументов StringBuffer(), конструктор с числовым аргументом и конструктор с текстовым аргументом (типа String или StringBuffer).
При использовании конструктора без аргумента создается объект класса StringBuffer со значением в виде пустой текстовой строки, а также автоматически резервируется память еще для 16-ти символов (буфер памяти). Чтобы в явном виде указать размер буфера памяти при создании объекта класса StringBuffer, используют конструктор с числовым аргументом. Для создания копии уже существующего текстового объекта применяют конструктор с текстовым аргументом.
Некоторые методы для работы с объектами класса StringBuffer перечислены и кратко описаны в табл. 2.
Некоторые из этих методов аналогичны тем, что рассматривались для класса String. Примеры использования нескольких из перечисленных методов приведены в листинге 8.
Таблица 2.Методы для работы с классом StringBuffer
Метод | Описание |
length() | Метод возвращает текущую длину текстовой строки |
Методом возвращается, выделенный для данной текстовой | |
capacity() | переменной, объем памяти (в символах, то есть количество |
символов, которые можно записать в текстовую строку) | |
ensureCapacity() | Метод выделения памяти для уже созданного объекта. Размер выделяемой памяти указывается аргументом метода |
setLength() | Методом устанавливается длина текстовой строки (аргумент метода) |
charAt() | Методом возвращается символ в строке с указанным индексом (аргумент метода) |
У метода два аргумента: индекс символа в строке и символь | |
setCharAt() | ное значение. Символ строки с заданным первым аргументом индексом заменяется символом, указанным вторым аргумен- |
том метода. Изменяется исходная строка | |
Копирование строки в символьный массив. Аргументы метода: | |
начальный индекс подстроки и индекс первого не входящего | |
getChars() | в подстроку символа, массив, в который выполняется копирование, а также индекс элемента в этом массиве, начиная с которого в массив производится посимвольное копирование |
подстроки | |
append() | Методом в конец строки вызова добавляется текст, указанный аргументом метода |
Методом в строку вызова выполняется вставка текста, указан- | |
insert() | ного вторым аргументом метода. Первым аргументом метода |
указывается индекс начала вставки подстроки | |
reverse() | Метод меняет порядок следования символов в строке вызова. Аргументов у метода нет |
delete() | Методом из строки вызова удаляется подстрока. Первым аргументом метода указывается индекс начала удаляемой подстроки, вторым — индекс первого после удаляемой подстроки символа |
Метод | Описание |
deleteCharAt() | Методом из строки вызова удаляется символ с индексом, указанным аргументом метода |
replace() | Методом из строки вызова удаляется подстрока и на ее место вставляется другой текст. Первым аргументом метода указывается индекс начала удаляемой подстроки, вторым — индекс первого после удаляемой подстроки символа. Третий аргумент метода — текст, вставляемый вместо удаленной подстроки |
Листинг 8.Работа с объектами класса StringBuffer
class StringBufferDemo{
public static void main(String args[]){
// Базовая строка - объект класса StringBuffer:
StringBuffer str=new StringBuffer("Мы программируем на С++");
// Длина строки:
System.out.println(str.length());
// Размер строки (максимальная длина в символах):
System.out.println(str.capacity());
// Вставка подстроки:
str.insert(20,"Java и ");
// Вывод строки на экран:
System.out.println(str);
// Замена подстроки:
str.replace(27,30,"Pascal");
// Вывод подстроки на экран:
System.out.println(str);
// Инверсия строки:
str.reverse();
// Вывод строки на экран:
System.out.println(str);}
}
В программе командой StringBuffer str=new StringBuffer("Мы программируем на С++") создается объект класса StringBuffer с текстовым значением Мы программируем на С++, и ссылка на этот объект записывается в переменную str. Командой System.out.println(str.length()) длина (в символах) данной текстовой строки выводится на экран. Размер (в символах) для того же тестового объекта отображается командой System.out.println(str.capacity()). Несложно проверить, что в строке Мы программируем на С++ всего 23 символа. Размер объекта на 16 символов больше и составляет 39 символов. Причина весьма проста — при создании объекта класса StringBuffer на основе текстового значения по умолчанию выделяется 16 дополнительных позиций для внесения изменений в строку в последующем.
Командой str.insert(20,"Java и ") в строку str, начиная с 20-го индекса (это 21-й символ), выполняется вставка текста "Java и ". В результате строка получает новое значение:
Мы программируем на Java и С++
Замена подстроки в строке str реализуется с помощью команды str.replace(27,30,"Pascal"). В частности, удаляются символы с индексами с 27-го по 29-й включительно (текст С++), и вместо этой подстроки вставляется слово Pascal. В результате значение строки str становится равным:
Мы программируем на Java и Pascal
Наконец, после выполнения команды str.reverse() строка str инвертируется — меняется порядок следования символов в строке. Результат выполнения программы таков:
Мы программируем на Java и С++
Мы программируем на Java и Pascal
lacsaP и avaJ ан меуриммаргорп ыМ
Обращаем внимание читателя на разницу между длиной текстовой строки, реализованной объектом StringBuffer, и размером этой строки. Длина строки определяется фактическим количеством символов в строке, а размер — объемом памяти (в символах), выделенным для хранения значения объекта. Обычно занята не вся память и часть позиций «вакантна». Этим объясняется необходимость в использовании двух методов: length() и capacity(). При работе с объектами класса String такой проблемы не возникает. Там длина строки совпадает с размером.
Дата добавления: 2016-06-22; просмотров: 1489;