1 Java 7. ОБРАБОТКА СТРОК
2 Строка в языке Java Строка в языке Java – (основной носитель текстовой информации) НЕ МАССИВ символов типа char, А ОБЪЕКТ соответствующего класса. Для работы со строками системная библиотека java.lang содержит классы (объявленные как final) String StringBuilder StringBuffer Для форматирования и обработки строк применяются классы Formatter Pattern Matcher и др.
3 Изменение значения объекта String Каждая строка, создаваемая с помощью оператора new или с помощью литерала является объектом класса String. String str = new String(); String lit = объект инициализируется значением литерала; Значение объекта класса String не может быть изменено после создания объекта при помощи какого-либо метода класса. Любое изменение строки приводит к созданию нового объекта. Ссылку на объект класса String можно изменить так, чтобы она указывала на другой объект и тем самым на другое значение. example01 : передача строки по ссылке RefString.java
4 Конструкторы класса String String() String(String str) String(byte asciichar[ ]) String(char[ ] unicodechar) String(StringBuffer sbuf) String(StringBuilder sbuild) и др. Пример: new String(str.getChars(), "UTF-8")
5 Класс String: методы для работы со строками (1) String concat(String s) + слияние строк boolean equals(Object ob) boolean equalsIgnoreCase(String s) сравнение строк с учетом и без учета регистра соответственно int compareTo(String s) Int compareToIgnoreCase(String s) лексикографическое сравнение строк с учетом и без учета регистра метод осуществляет вычитание кодов символов вызывающей и передаваемой в метод строк и возвращает целое значение метод возвращает значение нуль в случае, когда equals() возвращает значение true
6 Класс String: методы для работы со строками (2) boolean contentEquals(StringBuffer ob) сравнение строки и содержимого объекта типа StringBuffer String substring(int n, int m) извлечение из строки подстроки длины m-n, начиная с позиции n ( нумерация символов в строке начинается с нуля) int length() определение длины строки boolean isEmpty() возвращает true, если длина строки равна 0 int indexOf(char ch) определение позиции символа в строке static String valueOf(значение) преобразование переменной базового типа к строке
7 Класс String: методы для работы со строками (3) String toUpperCase() String toLowerCase() преобразование всех символов вызывающей строки в верхний/нижний регистр String replace(char с1, char с2) замена в строке всех вхождений первого символа вторым символом String intern() заносит строку в пул литералов и возвращает ее объектную ссылку String trim() удаление всех пробелов в начале и конце строки char charAt(int position) возвращение символа из указанной позиции (нумерация с нуля)
8 Класс String: методы для работы со строками (4) byte[ ] getBytes() getChars(int srcBegin, int srcEnd, char[ ] dst, int dstBegin) извлечение символов строки в массив байт или символов static String format(String format, Object... args) static String format(Locale l, String format, Object... args) генерирует форматированную строку, полученную с использованием формата, интернационализации и др. String[ ] split(String regex) String[ ] split(String regex, int limit) поиск вхождения в строку заданного регулярного выражения (разделителя) и деление исходной строки в соответствии с этим на массив строк example02 : применение некоторых методов DemoString.java
9 Особенности хранения и идентификации объектов в Java все ссылки хранятся в стеке, а объекты - в куче, строковые литералы сохраняются в пуле строк. В пул строк кладутся все строковые литералы, объявленные в коде. При совпадении литералов (в смысле equals ) используется один и тот же объект, находящийся в пуле. Строку в пул можно поместить принудительно, с помощью метода String.intern() Этот метод возвращает из пула строку, равную той, у которой был вызван этот метод. Если же такой строки нет – в пул кладется та, у которой вызван метод, после чего возвращается ссылка на нее же. example03 : сравнение ссылок и объектов EqualStrings.java применение intern() DemoIntern.java
10 Сравнение с литералами В конструкции типа str.equals("abc") есть недостаток – возможность получить NullPointerException Избежать его можно: str != null && str.equals("abc") Другой способ: "abc".equals(str)
11 Сложение строк Для строк определена операция сложения ссылок. Поскольку объект класса строки неизменяем, то результатом сложения str1 = str1 + str2 будет новый объект: выделяется память, достаточная для того, чтобы вместить туда содержимое обеих строк str1 и str2. в эту память копируется содержимое сначала первой строки str1, потом второй str2. затем переменной str1 присваивается ссылка на новую строку, а старая строка отбрасывается. Для файла с длиной строки 80 символов, в котором 1000 строк (80кб) при сложении всех строк в цикле первая строка будет скопирована в памяти 1000 раз, вторая – 999 и т.д. И при средней длине 80 символов через память пройдет (( ) * 1000 / 2) * 80 = символов, что составляет около 80 Мб (!!!) памяти. НИКОГДА не используйте прямую конкатенацию строк, особенно в циклах by.alerof.demoStringMerge
12 Выборка подстроки и копирующий конструктор Класс java.lang.String содержит в себе три поля: private final char value[ ]; private final int offset; private final int count; String str = Java2EnterpriseEdition; str = str.substring(5,10); Для увеличения скорости при выборке подстроки используется ТОТ ЖЕ МАССИВ, что и в исходной строке. String str = Java2EnterpriseEdition; str = new String(str.substring(5,10)); value [J,a,v,a,2,E,n,t,e,r,p,r, …] offset = 5 count = 5 value [E,n,t,e,r][E,n,t,e,r] offset = 0 count = 5
13 Классы StringBuilder и StringBuffer Cодержимое и размеры объектов классов StringBuilder и StringBuffer можно изменять. StringBuilder – более быстрый в обработке StringBuffer – потокобезопасен Объекты классов StringBuffer, StringBuilder и String можно преобразовывать друг в друга. Конструктор класса StringBuffer (также как и StringBuilder ) может принимать в качестве параметра объект String или неотрицательный размер буфера.
14 StringBuilder и StringBuffer : основные методы (1) void setLength(int n) установка размера буфера void ensureCapacity(int minimum) установка гарантированного минимального размера буфера int capacity() возвращение текущего размера буфера StringBuffer append(параметры) добавление к содержимому объекта строкового представления аргумента, который может быть символом, значением базового типа, массивом и строкой StringBuffer insert(параметры) вставка символа, объекта или строки в указанную позицию
15 StringBuilder и StringBuffer : основные методы (2) StringBuffer deleteCharAt(int index) удаление символа StringBuffer delete(int start, int end) удаление подстроки StringBuffer reverse() обращение содержимого объекта replace(), substring(), charAt(), length(), getChars(), indexOf() и др. методы, аналогичные методам класса String example04 : свойства объекта StringBuffer DemoStringBuffer.java изменение объекта StringBuffer: RefStringBuffer.java
16 Сравнение объектов StringBuilder и StringBuffer Для класса StringBuilder и StringBuffer НЕ переопределены методы equals() и hashCode() Хэш-коды всех объектов этого типа вычисляются так же, как и для класса Object. example05 : сравнение объектов StringBuffer и их хэш-кодов EqualsStringBuffer.java
17 Форматирование строк Класс java.util.Formatter обеспечивает преобразование формата, позволяющее выводить числа, строки, время и даты в любом необходимом разработчику виде. Метод format() – преобразует переданные в него параметры в строку заданного формата и сохраняет в объекте типа Formatter У классов PrintStream и PrintWriter объявлен метод printf() с параметрами идентичными параметрам метода format(), который осуществляет форматированный вывод в поток
18 Спецификаторы формата %aШестнадцатеричное значение с плавающей точкой %bЛогическое (булево) значение аргумента %cСимвольное представление аргумента %dДесятичное целое значение аргумента %hХэш-код аргумента %eЭкспоненциальное представление аргумента %fДесятичное значение с плавающей точкой %gВыбирает более короткое представление из двух: %е или %f %oВосьмеричное целое значение аргумента %nВставка символа новой строки %sСтроковое представление аргумента %tВремя и дата %xШестнадцатеричное целое значение аргумента %Вставка знака % example06: SimpleFormatString, FormatterDemoNumber
19 Cпецификаторы для форматирования даты и времени Все спецификаторы для форматирования даты и времени могут употребляться только для типов long Long Calendar Date
20 Cпецификатор формата Выполняемое преобразование %tHЧас (00 – 23) %tIЧас (1 – 12) %tMМинуты как десятичное целое (00 – 59) %tSСекунды как десятичное целое (00 – 59) %tLМиллисекунды (000 – 999) %tYГод в четырехзначном формате %tyГод в двузначном формате (00 – 99) %tBПолное название месяца (Январь) %tb или %thКраткое название месяца (янв) %tmМесяц в двузначном формате (1 – 12) %tAПолное название дня недели (Пятница) %taКраткое название дня недели (Пт) %tdДень в двузначном формате (1 – 31)
21 Cпецификатор формата Выполняемое преобразование %tRТо же что и "%tH:%tM" %tTТо же что и "%tH:%tM:%tS" %trТо же что и "%tI:%tM:%tS %Tp" где %Tp = (AM или PM) %tDТо же что и "%tm/%td/%ty" %tFТо же что и "%tY–%tm–%td" %tcТо же что и "%ta %tb %td %tT %tZ %tY" example07 : форматирование даты и времени: FormatterDemoTimeAndDate.java
22 Спецификатор точности Спецификатор точности применяется только в спецификаторах формата %f, %е, %g для данных с плавающей точкой и в спецификаторе %s – для строк. Задает количество выводимых десятичных знаков или символов. Например %10.4f выводит число с минимальной шириной поля 10 символови с четырьмя десятичными знаками. Принятая по умолчанию точность равна шести десятичным знакам. Примененный к строкам спецификатор точности задает максимальную длину поля вывода. Например, %5.7s выводит строку длиной не менее пяти и не более семи символов. Если строка длиннее, конечные символы отбрасываются. example08: применение флагов форматирования: FormatterDemoFlags.java
23 Соответствие между спецификаторами и аргументами По умолчанию соответствие между спецификаторами и аргументами, на которые они воздействуют, устанавливается в соответствии с порядком их следования, слева направо. Используя порядковый номер или индекс аргумента, можно указать явное соответствие спецификатора формата аргументу. Порядковый номер аргумента указывается за знаком % в спецификаторе формата и имеет следующий формат: N$. Символ N обозначает порядковый номер нужного аргумента, нумерация аргументов начинается с единицы. example09: применение порядкового номера аргумента: FormatterDemoArguments.java
24 Ключевые моменты Строка в языке Java – НЕ МАССИВ символов, а ОБЪЕКТ Строковые литералы сохраняются в пуле строковых литералов ( String.intern() ) Для строк переопределены методы equals() и hashCode(), и возможно сравнение по ссылке с использованием пула литералов Любое изменение строки приводит к созданию нового объекта: НИКОГДА не используйте прямое сложение строк, особенно в циклах Для увеличения скорости при выборке подстроки используется ТОТ ЖЕ МАССИВ, что и в исходной строке. Cодержимое и размеры объектов классов StringBuilder и StringBuffer можно изменять Для классов StringBuilder и StringBuffer не переопределены методы equals() и hashCode() Для форматирования строк используется класс java.util.Formatter