Изменение текстовых строк


Как уже неоднократно отмечалось, объекты класса 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.017 сек.