Меню сайта

Урок 9. Работа со строками в Java ( Часть 1 )

В этой главе обсуждаются средстваязыка Java для работы со строками. В язы­ках С и C++ отсутствует встроеннаяподдержка такого объекта, как строка. В них при необхо­димости передается адреспоследовательности байтов, содержимое которых трактуется как символы до тех пор,пока не будет встречен нулевой байт, отмечающий конец строки. В пакет java.lang встроен класс,инкапсулирующий структуру данных, соответ­ствующую строке. Этот класс,называемый String, не чтоиное, как объ­ектное представление неизменяемого символьного массива. В этом классе есть методы, которыепозволяют сравнивать строки, осуществлять в них поиск и извлекать определенныесимволы и подстроки.Класс StringBuffer используется тогда, когда строку послесоздания требу­ется изменять.

ВНИМАНИЕ

И String, и StringBufferобъявлены final, что означает, что ни от одного из этих классов нельзяпроизводить подклассы. Это было сделано для того, чтобы можно было применитьнекоторые виды оптимизации по­зволяющие увеличить производительность привыполнении операций обработки строк.

Конструкторы

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

Strings = new String():

Приведенный ниже фрагмент кодасоздает объект s типа String иници­ализируя его строкой из трех символов,переданных конструктору в ка­честве параметра в символьном массиве.

charchars[] = { ‘а’, ‘b’, ‘с’ }:

Strings = new String(chars)-

System.out.println(s):

Этот фрагмент кода выводит строку «abc». Итак, у этогоконструктора — 3 параметра:

String(charchars[], int начальныйИндекс, int числоСимволов)-

Используем такой способ инициализации в нашем очередномпримере:

charchars[] = { ‘a’, ‘b’, ‘с’, ‘d’, ‘e’, ‘f’ }:

Strings = new String(chars,2,3)-

System.out.println(s)-

Этот фрагмент выведет «cde».

Специальный синтаксис дляработы со строками

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

Создание строк

Java включает в себя стандартное сокращение для этойопера­ции — запись в виде литерала, в которой содержимое строки заключа­ется впару двойных кавычек. Приводимый ниже фрагмент кода экви­валентен одному изпредыдущих, в котором строка инициализировалась массивом типа char.

Strings = «abc»-

System.out.println(s)-

Один из общих методов, используемых с объектами String —метод length, возвращающий число символов в строке. Очередной фрагмент вы­водитчисло 3, поскольку в используемой в нем строке — 3 символа.

Strings = «abc»-

System.out.println(s.length)-

В Java интересно то, что для каждой строки-литерала создаетсясвой представитель класса String, так что вы можете вызывать методы этого классанепосредственно со строками-литералами, а не только со ссылоч­ными переменными.Очередной пример также выводит число 3.

System.out.println(«abc».Length())-

Слияние строк

Строку

Strings = «Не is » + age + » years old.»-

в которой с помощью оператора + три строки объединяются водну, про­честь и понять безусловно легче, чем ее эквивалент, записанный сяв­ными вызовами тех самых методов, которые неявно были использованы в первомпримере:

Strings = new StringBuffer(«He is «).append(age)-

s.append(«years old.»).toString()-

По определению каждый объект класса String не можетизменять­ся. Нельзя ни вставить новые символы в уже существующую строку, нипоменять в ней одни символы на другие. И добавить одну строку в конец другойтоже нельзя. Поэтому транслятор Java преобразует опера­ции, выглядящие, какмодификация объектов String, в операции с род­ственным классом StringBuffer.

ЗАМЕЧАНИЕ

Все это может показатьсявам необоснованно сложным. А почему нельзя обойтись одним классом String,позволив ему вести себя при­
мерно так же, как StringBuffer? Все дело впроизводительности. Тот факт, что объекты типа String в Java неизменны,позволяет транслято­ру применять к операциям с ними различные способыоптимизации.

Последовательность выполнения операторов

Давайте еще раз обратимся к нашему последнему примеру:

Strings = «Не is » + age + » years old.»-

В том случае, когда age — не String, а переменная, скажем,типа int, в этой строке кода заключено еще больше магии транслятора. Целоезначение переменной int передается совмещенному методу append классаStringBuffer, который преобразует его в текстовый вид и добавляет в конецсодержащейся в объекте строки. Вам нужно быть вниматель­ным при совместномиспользовании целых выражений и слияния строк, в противном случае результатможет получиться совсем не тот, который вы ждали. Взгляните на следующую строку:

Strings = «four: » + 2 + 2-

Быть может, вы надеетесь, что в sбудет записана строка «four: 4»? Не угадали — с вами сыграла злую шуткупоследовательность выпол­нения операторов. Так что в результате получа­ется»four: 22″.

Для того, чтобы первым выполнилось сложение целых чисел,нужно использовать скобки :

Strings =«four: » + (2 + 2)-

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

В каждом классе String есть метод toString — либо своясобственная реализация, либо вариант по умолчанию, наследуемый от класса Object.Класс в нашем очередном примере замещает наследуемый метод toStrring своимсобственным, что позволяет ему выводить значения переменных объекта.

classPoint {

intх, у-

Point(intx, int у) {

this.x= х-

this.у= у-

}

publicString toString() {

return»Point[» + x + «, » + у + «]»-

} }

classtoStringDemo {

publicstatic void main(String args[]) {

Pointp = new Point(10, 20)-

System.out.println(«p= » + p)-

}}

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

С:&#92-&gt-Java toStringDemo
p = Point[10, 20]

Извлечение символов

Для того, чтобы извлечь одиночныйсимвол из строки, вы можете со­слаться непосредственно на индекс символа встроке с помощью метода charAt. Если вы хотите в один прием извлечь несколькосимволов, можете воспользоваться методом getChars. В приведенном ниже фрагментепоказано, как следует извлекать массив символов из объекта типа String.

classgetCharsDemo {

publicstatic void main(String args[]) {

Strings = «This is a demo of the getChars method.»-

intstart = 10-

intend = 14-

charbuf[] = new char[end — start]-

s.getChars(start,end, buf, 0)-

System.out.println(buf)-

}}

Обратите внимание — метод getChars не включает в выходнойбуфер символ с индексом end. Это хорошо видно из вывода нашего примера —выводимая строка состоит из 4 символов.

С:&#92-&gt- java getCharsDemo

demo

Для удобства работы в String естьеще одна функция — toCharArray, которая возвращает в выходном массиве типа charвсю строку. Альтернативнаяформа того же самого механизма позволяет записать содержимое строки в массивтипа byte, при этом значения старших бай­тов в 16-битных символах отбрасываются.Соответствующий метод на­зывается getBytes, и его параметры имеют тот же смысл,что и пара­метры getChars, но с единственной разницей — в качестве третьегопараметра надо использовать массив типа byte.

Сравнение

Если вы хотите узнать, одинаковыли две строки, вам следует воспользоваться методом equals класса String.Альтернативная форма этого метода называется equalsIgnoreCase, при ееиспользовании различие ре­гистров букв в сравнении не учитывается. Ниже приведен пример,иллюстрирующий использование обоих методов:

classequalDemo {

publicstatic void main(String args[]) {

Strings1 = «Hello»-

Strings2 = «Hello»-

Strings3 = «Good-bye»-

Strings4 = «HELLO»-

System.out.println(s1+ » equals »
+ s2 + » -&gt- » + s1.equals(s2))-

System.out.println(s1+ » equals » + s3 + » -&gt- » + s1.equals(s3))-

System.out.println(s1+ » equals » + s4 + » -&gt- » + s1.equals(s4))-

System.out.println(s1+ » equalsIgnoreCase » + s4 + » -&gt- » +

s1.equalsIgnoreCase(s4))-

}}

Результат запуска этого примера :

С:&#92-&gt- java equalsDemo

Helloequals Hello -&gt- true

Helloequals Good-bye -&gt- false

Helloequals HELLO -&gt- false

HelloequalsIgnoreCase HELLO -&gt- true

В классе String реализованагруппа сервисных методов, являющихся специализированными версиями метода equals.Метод regionMatchesиспользуется для сравнения подстроки в исходной строке с подстрокой встроке-параметре. МетодstartsWith проверяет, начинается ли данная подстрока фрагментом, переданнымметоду в качестве параметра. Метод endsWith проверяет совпадает ли с параметром конец строки.

Равенство

Метод equals и оператор == выполняют две совершенноразличных проверки. Если метод equal сравнивает символы внутри строк, тоопе­ратор == сравнивает две переменные-ссылки на объекты и проверяет, указываютли они на разные объекты или на один и тот же. В очеред­ном нашем примере этохорошо видно — содержимое двух строк оди­наково, но, тем не менее, это —различные объекты, так что equals и == дают разные результаты.

classEqualsNotEqualTo {

publicstatic void main(String args[]) {

Strings1 = «Hello»-

Strings2 = new String(s1)-

System.out.println(s1+ » equals » + s2 + » -&gt- » + s1.equals(s2))-

System.out.println(s1+ » == » + s2 + «, -&gt- » + (s1 == s2))-

} }

Вот результат запуска этого примера:

C:&#92-&gt- java EqualsNotEqualTo

Hello equals Hello -&gt- true
Hello == Hello -&gt- false

Упорядочение

Зачастую бывает недостаточнопросто знать, являются ли две строки идентичными. Для приложений, в которыхтребуется сортировка, нужно знать, какая из двух строк меньше другой. Для ответана этот вопрос нужно воспользоваться методом compareTo класса String. Если целоезначение, возвращенное методом, отрицательно, то строка, с которой был вызванметод, меньше строки-параметра, если положительно — больше. Если же методcompareTo вернул значение 0, строки идентичны. Ниже приведена программа, вкоторой выполняется пузырьковая сорти­ровка массива строк, а для сравнения строкиспользуется метод compareTo.Эта программа выдает отсортированный в алфавитном порядке списокстрок.

classSortString {

staticString arr[] = {«Now», «is», «the», «time», «for», «all»,

«good», «men», «to»,»come», «to», «the»,

«aid», «of», «their»,»country» }-

publicstatic void main(String args[]) {

for(int j = 0- i &lt- arr.length- j++){

for (int i = j+1- i &lt- arr.length- i++) {

if (arr[i].compareTo(arr[j]) &lt- 0){

String t =arr[j]-

arr[j] =arr[i]-

arr[i] =t-

}

}

System.out.println(arr[j])-

}

}}

Категория: Обучение Java | Дата: 15.04.13

Меню раздела
Блок