1 Работа со строками в Java В языках С и C++ отсутствует встроенная поддержка такого объекта, как строка. В этих ЯП при необходимости передается адрес последовательности байтов, содержимое которых трактуется как символы до тех пор, пока не будет встречен нулевой байт, отмечающий конец строки. В пакет java.lang встроен класс String, определяющий структуру данных, соответствующую строке. Этот класс – объектное представление неизменяемого символьного массива. В этом классе есть методы, которые позволяют сравнивать строки, осуществлять в них поиск и извлекать определенные символы и подстроки. Второй встроенный класс для работы со строками – StringBuffer используется тогда, когда строку после создания требуется изменять. Многие возможности данных классов скрыты либо выполняются автоматически, что дает возможность более комфортного программирования. String и StringBuffer объявлены final, что означает, что от них нельзя производить классы-наследники. Это сделано для того, чтобы можно было применить некоторые виды оптимизации, позволяющие увеличить производительность при выполнении операций обработки строк.
2 Работа со строками в Java Класс String Конструкторы класса String: 1.Конструктор по умолчанию создает пустую строку: String s = new String(); 2.Конструктор с параметром в виде массива символов создает строку, содержащую весь массив: char chars[ ] = { 'а', 'b', 'с' }; String s = new String(chars); 3.Конструктор с тремя параметрами создает строку, являющуюся подстрокой переданного массива символов: String(char chars[ ], int начальныйИндекс, int числоСимволов); char chars[ ] = { 'a', 'b', 'с', 'd', 'e', 'f' }: String s = new String(chars,2,3); Синтаксис Java дополнен рядом сервисных возможностей для работы со строками. А) Совмещение объявления и инициализации строками-литералами. Например, записи: String s = new String(abc); String s = abc; эквиваленты вызову второго конструктора, поскольку во всех случаях создается объект String. Б) Все методы класса String можно присоединять прямо строковым литералам. s равно abc s равно cde s равно
3 Работа со строками в Java Класс String Методы обработки строк. length() – возвращает количество символов в строке и доступен сразу же после инициализации любого объекта String. Сложение строк: Строка String s = «Не is » + age + " years old."; полученная с помощью оператора «+» три строки объединяются в одну, эквивалентна: String s = new StringBuffer("He is ").append(age); s.append(" years old.").toString(); По определению каждый объект класса String не может изменяться. Нельзя ни вставить новые символы в уже существующую строку, ни поменять в ней одни символы на другие. И добавить одну строку в конец другой тоже нельзя. Поэтому транслятор Java преобразует операции модификации объектов String в операции с родственным классом StringBuffer. В том случае, когда age - не String, а переменная числового типа, например int, то оно передается совмещенному методу append класса StringBuffer, который преобразует его в текстовый вид и добавляет в конец содержащейся в объекте строки. String s = "four: " ; - дает результат "four: 22". String s = "four: " + (2 + 2); - дает результат «four: 4»
4 Работа со строками в Java Класс String Преобразование строк В корневом классе Object определен метод toString(), который задает правило перевода объектных переменных данного класса в строковый объект (в частности, для использования в операторе System.out.println( )). Каждый класс может определить собственную реализацию метода toString(), а может использовать вариант по умолчанию, наследуемый от класса Object. class Point { int х, у; Point(int x, int у) { this.x = х; this.у = у; } public String toString() { return "Point[" + x + ", " + у + "]"; } class ToStringDemo { public static void main(String args[]) { Point p = new Point(10, 20); System.out.println("p = " + p); } Ниже приведен результат, полученный при запуске этого примера. С:\> java ToStringDemo p = Point[10, 20] Класс Point замещает наследуемый метод toString() своим собственным, что позволяет ему выводить значения переменных объекта.
5 Работа со строками в Java Класс String Извлечение символов Для того, чтобы извлечь одиночный символ из строки, можно сослаться непосредственно на индекс символа в строке с помощью метода charAt(). Если необходимо в один прием извлечь несколько символов, можно воспользоваться методом getChars. В приведенном ниже фрагменте показано, как следует извлекать одиночный символ и массив символов из объекта типа String. class GetCharsDemo { public static void main(String args[ ]) { String s = "This is a demo of the getChars method."; int start = 10; int end = 14; char cc = s.charAt(5); char buf[ ] = new char[end - start]; s.getChars(start, end, buf, 0); System.out.println(cc +, + buf); } Вывод: С:\> java GetCharsDemo i, demo Для удобства работы в String есть еще одна функция - toCharArray, которая возвращает в выходном массиве типа char всю строку. Обратите внимание - метод getChars не включает в выходной буфер символ с индексом end. Выводимая строка состоит из 4 символов. Извлечение одиночного символа с помощью метода charAt() Индексы символов, как и у обычных массивов начинаются с нуля
6 Работа со строками в Java Класс String Сравнение Для сравнения строк применяются методы equals() и equalsIgnoreCase() класса String. Первый производит сравнение с учетом регистра, второй – без учета регистра. Оба метода возвращают true, если строки полностью совпадают, и false – в противном случае. class EqualDemo { public static void main(String args[]) { String s1 = "Hello"; String s2 = "Hello"; String s3 = "Good-bye"; String s4 = "HELLO"; System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); System.out.println(s1 + " equals " + s3 + " -> " + s1.equals(s3)); System.out.println(s1 + " equals " + s4 + " -> " + s1.equals(s4)); System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " + s1.equalsIgnoreCase(s4)); } Результат запуска этого примера : С:\> java EqualsDemo Hello equals Hello -> true Hello equals Good-bye -> false Hello equals HELLO -> false Hello equalsIgnoreCase HELLO -> true В классе String реализована группа сервисных методов, являющихся специализированными версиями метода equals. Метод regionMatches используется для сравнения подстроки в исходной строке с подстрокой в строке-параметре. Метод startsWith проверяет, начинается ли данная подстрока фрагментом, переданным методу в качестве параметра. Метод endsWith проверяет совпадает ли с параметром конец строки.
7 Работа со строками в Java Класс String Равенство Метод equals и оператор == выполняют две совершенно различные проверки. Метод equals сравнивает символы внутри строк, а оператор== сравнивает две переменные-ссылки на объекты и проверяет, указывают ли они на разные объекты или на один и тот же. class EqualsNotEqualTo { public static void main(String args[ ]) { String s1 = "Hello"; String s2 = new String(s1); System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); System.out.println(s1 + " == " + s2 + ", -> " + (s1 == s2)); } Вот результат запуска этого примера: C:\> java EqualsNotEqualTo Hello equals Hello -> true Hello == Hello -> false Содержимое двух строк одинаково. Однако это - различные объекты, так что equals и == дают разные результаты.
8 Работа со строками в Java Класс String Посимвольное сравнение в лексико-графическом порядке. Для сравнения строк и ответа на этот вопрос: какая из двух строк больше/меньше (в смысле порядковых номеров символов таблицы ASCII) применяется метод compareTo() класса String. int k = s1.compareTo(s2); Если целое значение k, возвращенное методом, отрицательно, то строка s1 (с которой был вызван метод), «меньше» строки-параметра s2, если k положительно, то s1 «больше» s2. Если k = 0, строки s1 и s2 идентичны («равны»). class SortString { static String arr[ ] = {"Now", "is", "the", "time", "for", "all", "good", "men", "to", "come", "to", "the", "aid", "of", "their", "country" }; public static void main(String args[ ]) { for (int j = 0; j < arr.length; j++) { for (int i = j + 1; i < arr.length; i++) { if (arr[i].compareTo(arr[j]) < 0) { String t = arr[j]; arr[j] = arr[i]; arr[i] = t; } System.out.println(arr[j]); } Метод compareTo() полезен для проведения сортировки строк в лексико-графическом порядке (по номерам символов в таблице ASCII). Вывод программы: Now aid all come country for good is men of the their time to
9 Работа со строками в Java Поиск символа или подстроки В класс String включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода - indexOf и lastIndexOf. Каждый из этих методов возвращает индекс символа либо индекс начала искомой подстроки. В любом случае, если поиск оказался неудачным методы возвращают значение -1. class IndexOfDemo { public static void main(String args[ ]) { String s = "Now is the time for all good men " + "to come to the aid of their country " + "and pay their due taxes."; System.out.println(s); System.out.println("indexOf(t) = " + s.indexOf('t)); System.out.println("lastlndexOf(t) = " + s.lastlndexOf('t)); System.out.println("indexOf(the) = " + s.indexOf("the")); System.out.println("lastlndexOf(the) = " + s.lastlndexOf("the")); System.out.println("indexOf(t, 10) = " + s.indexOf('t, 10)); System.out.println("lastlndexOf(t, 50) = " + s.lastlndexOf('t, 50)); System.out.println("indexOf(the, 10) = " + s.indexOf("the", 10)); System.out.println("lastlndexOf(the, 50) = " + s.lastlndexOf("the", 50)); } } С:> java IndexOfDemo indexOf(t) = 7 lastlndexOf(t) = 87 indexOf(the) = 7 lastlndexOf(the) = 77 indexОf(t, 10) = 11 lastlndexОf(t, 50) = 44 indexОf(the, 10) = 44 lastlndexОf(the, 50) = 44 Класс String 0.Now is the time for all good men to come to the aid of their country and pay their due taxes. 1.Now is the time for all good men to come to the aid of their country and pay their due taxes. 2.Now is the time for all good men to come to the aid of their country and pay their due taxes. 3.Now is the time for all good men to come to the aid of their country and pay their due taxes. 4.Now is the time for all good men to come to the aid of their country and pay their due taxes. 5.Now is the time for all good men to come to the aid of their country and pay their due taxes. 8.Now is the time for all good men to come to the aid of their country and pay their due taxes. 7.Now is the time for all good men to come to the aid of their country and pay their due taxes. 6.Now is the time for all good men to come to the aid of their country and pay their due taxes.
10 Работа со строками в Java Модификация строк при копировании Поскольку объекты класса String нельзя изменять, при модификации строки необходимо либо копировать ее в объект типа StringBuffer, либо использовать один из описываемых ниже методов класса String, которые автоматически создают новый строковый объект, внося в него необходимые изменения. substring - извлечение подстроки из объекта String. Этот метод создает новый объект из символов оригинальной строки, указанного диапазона. "Hello World".substring(6) -> "World" "Hello World".substring(3,8) -> "lo Wo" concat - слияние или «конкатенация» строк. Этот метод создает новый объект String, копируя в него содержимое исходной строки и добавляя в ее конец строку, указанную в параметре метода. "Hello".concat(" World") -> "Hello World" replace – замена первого символа на второй во всей строке и создание нового объекта String. "Hello".replace('l', 'w') -> "Hewwo" toLowerCase и toUpperCase – преобразование всех символов исходной строки в нижний и верхний регистр, соответственно. "Hello".toLowerCase() -> "hello" "Hello".toUpperCase() -> "HELLO" trim - убирает из исходной строки все ведущие и замыкающие пробелы. Hello World.trim() -> "Hello World" valueOf – переводит любой примитивный тип данных во вновь создаваемую строку. Если параметр один, то будут скопированы все символы, начиная с указанного и до конца строки. Если параметров два, в новую строку будут скопированы все символы, начиная с первого указанного, и до (но не включая его) символа, заданного конечным индексом. Класс String
11 Работа со строками в Java Класс StringBuffer Объекты типа StringBuffer представляют собой последовательности символов, которые могут расширяться и модифицироваться. Java активно использует оба класса, но многие программисты предпочитают работать только с объектами типа String, используя оператор «+». При этом Java выполняет всю необходимую работу со StringBuffer за сценой. Конструкторы StringBuffer() – по умолчанию резервируется место для размещения 16 символов без возможности изменения длины строки. StringBuffer(int i) – явное задание требуемого размера буфера в количестве i символов. StringBuffer(String s) – строка s будет скопирована в объект и дополнительно к этому в нем будет зарезервировано место еще для 16 символов. Текущая длина (количество символов) объекта StringBuffer определяется методом length, общее количество зарезервированного пространства под строку в объекте StringBuffer – методом capacity. class StringBufferDemo { public static void main(String args[ ]) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("buffer = " + sb); System.out.println("length = " + sb.length()); System.out. println("capacity = " + sb.capacity()); } С:\> java StringBufferDemo buffer = Hello length = 5 capacity = 21
12 Работа со строками в Java Класс StringBuffer Основные методы ensureCapacity – расширение созданного объекта StringBuffer на определенное количество символов. setLength – явное задание длины строки в буфере. Если значение, большее чем длина содержащейся в объекте строки, то конец новой, расширенной строки заполняется пробелами (символами с кодом нуль). charAt и setCharAt – извлечение одиночного символа и запись в заданную позицию строки нужного символа соответственно. class SetCharAtDemo { public static void main(String args[ ]) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("buffer before = " + sb); System.out.println("charAt(1) before = " + sb.charAt(1)); sb.setCharAt(1, 'i'); sb.setLength(2); System.out.println("buffer after = " + sb); System.out.println("charAt(1) after = " + sb.charAt(1)); } C:\> java SetCharAtDemo buffer before = Hello charAt(1) before = e buffer after = Hi charAt(1) after = i
13 Работа со строками в Java Класс StringBuffer Основные методы: append – обычно вызывается неявно при использовании оператора «+» в выражениях со строками String. Для параметра, переданного в метод append вызывается метод String.valueOf и его результат добавляется к текущему объекту StringBuffer. К тому же при каждом вызове метод append возвращает ссылку на объект StringBuffer, с которым он был вызван. Это позволяет выстраивать в цепочку последовательные вызовы метода append. class AppendDemo { public static void main(String args[ ]) { String s; int a = 42; StringBuffer sb = new StringBuffer(40); s = sb.append("a = ").append(a).append("!").toString(); System.out.println(s); } insert – как и append работает со всеми типами данных (перегруженные версии метода). Вставляет в заданное первым параметром место в буфере символы, возвращаемые методом String.valueOf. class InsertDemo { public static void main(String args[ ]) { StringBuffer sb = new StringBuffer("hello world !"); sb.insert(6,"there "); System.out.println(sb); } С:\> java AppendDemo а = 42! С:\> java InsertDemo hello there world!