- •724 Содержание
- •Глава 6. Интерфейсы и внутренние классы 139
- •У казания и ответы
- •Вопрос 3.2.
- •Вопрос 8.2.
- •Вопрос 8.3.
- •Вопрос 14.2.
- •Вопрос 21.5.
- •Ч асть 1. Основы языка java
- •Глава 1 введение в классы и объекты Основные понятия ооп
- •Язык Java
- •Нововведения версий 5.0 и 6.0
- •Простое приложение
- •Классы и объекты
- •Сравнение объектов
- •Консоль
- •Простой апплет
- •Задания к главе 1 Вариант a
- •Вариант b
- •Тестовые задания к главе 1
- •Вопрос 1.5.
- •Г лава 2 типы данных и операторы
- •Базовые типы данных и литералы
- •Документирование кода
- •Операторы
- •Классы-оболочки
- •Операторы управления
- •Массивы
- •Класс Маth
- •Управление приложением
- •Задания к главе 2 Вариант a
- •Вариант в
- •Тестовые задания к главе 2
- •Переменные класса и константы
- •Ограничение доступа
- •Конструкторы
- •Статические методы и поля
- •Модификатор final
- •Абстрактные методы
- •Модификатор native
- •Модификатор synchronized
- •Логические блоки
- •Перегрузка методов
- •Параметризованные классы
- •Параметризованные методы
- •Методы с переменным числом параметров
- •Перечисления
- •1 : Fpmi : Балаганов
- •Аннотации
- •Задания к главе 3 Вариант a
- •Вариант b
- •Тестовые задания к главе 3
- •Использование final
- •Использование super и this
- •Переопределение методов и полиморфизм
- •Методы подставки
- •Полиморфизм и расширяемость
- •Статические методы и полиморфизм
- •Абстракция и абстрактные классы
- •Класс Object
- •Клонирование объектов
- •“Сборка мусора” и освобождение ресурсов
- •Задания к главе 4 Вариант a
- •Вариант в
- •Тестовые задания к главе 4
- •Вопрос 4.7.
- •Г лава 5 проектирование классов Шаблоны проектирования grasp
- •Шаблон Expert
- •Шаблон Creator
- •Шаблон Low Coupling
- •Шаблон High Cohesion
- •Шаблон Controller
- •Шаблоны проектирования GoF
- •Порождающие шаблоны
- •К порождающим шаблонам относятся:
- •Шаблон Factory
- •Шаблон AbstractFactory
- •Шаблон Builder
- •Шаблон Singleton
- •Структурные шаблоны
- •К структурным шаблонам относятся:
- •Шаблон Bridge
- •Шаблон Decorator
- •Шаблоны поведения
- •К шаблонам поведения относятся:
- •Шаблон Command
- •Шаблон Strategy
- •Шаблон Observer
- •Тестовые задания к главе 5
- •Статический импорт
- •Внутренние классы
- •Внутренние (inner) классы
- •Вложенные (nested) классы
- •Анонимные (anonymous) классы
- •Задания к главе 6 Вариант а
- •Вариант b
- •Вариант c
- •Тестовые задания к главе 6
- •Вопрос 6.5.
- •Класс String
- •Классы StringBuilder и StringBuffer
- •Форматирование строк
- •Лексический анализ текста
- •Регулярные выражения
- •Интернационализация текста
- •Интернационализация чисел
- •Интернационализация дат
- •3 Апрель 2006 г.
- •Задания к главе 7 Вариант a
- •Вариант b
- •Тестовые задания к главе 7
- •Оператор throw
- •Ключевое слово finally
- •Собственные исключения
- •Наследование и исключения
- •Отладочный механизм assertion
- •Задания к главе 8
- •Байтовые и символьные потоки ввода/вывода
- •Предопределенные потоки
- •Сериализация объектов
- •Консоль
- •Класс Scanner
- •Архивация
- •Задания к главе 9 Вариант a
- •Вариант b
- •Вариант с
- •Тестовые задания к главе 9
- •Множества
- •Карты отображений
- •14El - найден по ключу '12'
- •Унаследованные коллекции
- •Класс Collections
- •Класс Arrays
- •Задания к главе 10 Вариант a
- •Вариант b
- •Тестовые задания к главе 10
- •Апплеты
- •Задания к главе 11
- •Тестовые задания к главе 11
- •Классы-адаптеры
- •Задания к главе 12
- •Тестовые задания к главе 12 Вопрос 12.1.
- •Вопрос 12.2.
- •Вопрос 12.3.
- •Вопрос 12.4.
- •Вопрос 12.5.
- •Г лава 13 элементы компоновки и управления
- •Менеджеры размещения
- •Элементы управления
- •Визуальные компоненты JavaBeans
- •Задания к главе 13 Вариант а
- •Вариант b
- •Жизненный цикл потока
- •Управление приоритетами и группы потоков
- •Управление потоками
- •Потоки-демоны
- •Потоки в графических приложениях
- •Методы synchronized
- •Инструкция synchronized
- •Состояния потока
- •Потоки в j2se 5
- •Задания к главе 14 Вариант а
- •Вариант b
- •Тестовые задания к главе 14
- •Вопрос 14.1.
- •Вопрос 14.2.
- •Вопрос 14.3.
- •Вопрос 14.4.
- •Вопрос 14.5.
- •Г лава 15 сетевые программы Поддержка Интернет
- •Сокетные соединения по протоколу tcp/ip
- •Многопоточность
- •Датаграммы и протокол udp
- •Задания к главе 15 Вариант а
- •Вариант b
- •Древовидная модель
- •Элементы таблицы стилей
- •Задания к главе 16 Вариант а
- •Тестовые задания к главе 16
- •Запуск контейнера сервлетов и размещение проекта
- •Первая jsp
- •Взаимодействие сервлета и jsp
- •Задания к главе 17 Вариант а
- •Вариант b
- •Интерфейс ServletContext
- •Интерфейс ServletConfig
- •Интерфейсы ServletRequest и HttpServletRequest
- •Интерфейсы ServletResponse и HttpServletResponse
- •Обработка запроса
- •Многопоточность
- •Электронная почта
- •Задания к главе 18 Вариант а
- •Вариант b
- •Стандартные элементы action
- •Неявные объекты
- •Демонстрация работы тегов c:forEach, c:choose, c:when, c:otherwise
- •Данная страница демонстрирует работу тегов
- •Включение ресурсов
- •Обработка ошибок
- •Технология взаимодействия jsp и сервлета
- •Задания к главе 19
- •Вариант а
- •Вариант b
- •Субд MySql
- •Простое соединение и простой запрос
- •Метаданные
- •Подготовленные запросы и хранимые процедуры
- •Транзакции
- •Id студента: 83, Petrov Внесены данные в students: 83, Petrov Внесены данные в course: 83, xml Данные внесены - транзакция завершена
- •Точки сохранения
- •Пул соединений
- •Задания к главе 20 Вариант а
- •Вариант b
- •Обработка событий
- •Фильтры
- •Задания к главе 21 Вариант а
- •Вариант b
- •Вопрос 21.5.
- •Вопрос 21.6.
- •Г лава22 пользовательские теги
- •Простой тег
- •Тег с атрибутами
- •Тег с телом
- •Элементы action
- •Задания к главе 22 Вариант а
- •Вариант b
- •П риложение 2
- •Включение скриптов на языке JavaScript в html-код
- •Отладка скриптов JavaScript
- •Типы данных
- •Специальные числа
- •Булев тип
- •Переменные типа Undefined и Null
- •Массивы
- •Операторы и выражения
- •Оператор with
- •Оператор switch
- •Метод eval()
- •Функции
- •Передача параметров по значению и по ссылке
- •Глобальные и локальные переменные
- •Пользовательские объекты
- •Прототипы
- •Встроенные объекты Array, Date, Math Объект Array
- •Объект Date
- •Объект Math
- •Объекты window и document
- •Создание новых узлов
- •Добавление новых узлов в документ
- •Удаление и замена узлов в документе
- •Использование каскадных таблиц стилей в dom
- •Свойство элемента innerHtml и outerHtml
- •Динамическое назначение событий
- •Ключевое слово this
- •П риложение3
- •Проектная модель
- •Uml как программный язык
- •Нотации и метамодель
- •Диаграммы, которые ниже будут рассмотрены с разной степенью детализации:
- •Свойства
- •Множественность
- •Операторы
- •П риложение 4 базы данных и язык sql
- •Реляционные субд Модель данных в реляционных субд
- •Нормализация модели данных
- •Язык sql
- •Команды sql
- •Команды определения структуры данных (DataDefinitionLanguage–ddl)
- •Команды манипулирования данными (Data Manipulation Language – dml)
- •Команды управления транзакциями (TransactionControlLanguage–tcl)
- •Команды управления доступом (DataControlLanguage–dcl)
- •Работа с командами sql
- •Ключевое слово distinct
- •Секция from, логическое связывание таблиц
- •Секция where
- •Секция orderby
- •Групповые функции
- •Секция group by
- •Секция having
- •Изменение данных
- •Команда insert
- •Команда delete
- •Команда update
- •Определение структуры данных Команда createtable
- •Команда droptable
- •П риложение5
- •П риложение 6
- •П риложение7 журнал сообщений (logger)
- •П риложение 8
- •Портлеты
Лексический анализ текста
Класс StringTokenizer содержит методы, позволяющие разбивать текст на лексемы, отделяемые разделителями. Набор разделителей по умолчанию: пробел, символ табуляции, символ новой строки, перевод каретки. В задаваемой строке разделителей можно указывать другие разделители, например «= , ; : ».
Класс StringTokenizer имеет конструкторы:
StringTokenizer(String str);
StringTokenizer(String str, String delimiters);
StringTokenizer(String str, String delimiters,
Boolean delimAsToken);
Некоторые методы:
String nextToken() – возвращает лексему как String объект;
boolean hasMoreTokens() – возвращает true, если одна или несколько лексем остались в строке;
int сountToken() – возвращает число лексем.
Класс был реализован в самой первой версии языка. Однако в настоящее время существуют более совершенные средства по обработке текстовой информации – регулярные выражения.
Регулярные выражения
Класс java.util.regex.Pattern применяется для определения регулярных выражений (шаблонов), для которых ищется соответствие в строке, файле или другом объекте, представляющем последовательность символов. Для определения шаблона применяются специальные синтаксические конструкции. О каждом соответствии можно получить информацию с помощью класса java.util.regex.Matcher.
Далее приведены основные логические конструкции для задания шаблона.
Если в строке, проверяемой на соответствие, необходимо, чтобы в какой-либо позиции находился один из символов некоторого символьного набора, то такой набор (класс символов) можно объявить, используя одну из следующих конструкций:
[abc] |
a, b или c |
[^abc] |
символ, исключая a, b и c |
[a-z] |
символ между a и z |
[a-d[m-p]] |
либо между a и d, либо между m и p |
[e-z&&[dem]] |
e либо m (конъюнкция) |
Кроме стандартных классов символов, существуют предопределенные классы символов:
. |
любой символ |
\d |
[0-9] |
\D |
[^0-9] |
\s |
[ \t\n\x0B\f\r] |
\S |
[^\s] |
\w |
[a-zA-Z_0-9] |
\W |
[^\w] |
\p{javaLowerCase} |
~ Character.isLowerCase() |
\p{javaUpperCase} |
~ Character.isUpperCase() |
При создании регулярного выражения могут использоваться логические операции:
ab |
после a следует b |
a|b |
a либо b |
(a) |
a |
Скобки, кроме их логического назначения, также используются для выделения групп.
Для определения регулярных выражений недостаточно одних классов символов, т. к. в шаблоне часто нужно указать количество повторений. Для этого существуют квантификаторы.
a? |
a один раз или ни разу |
a* |
a ноль или более раз |
a+ |
a один или более раз |
a{n} |
a n раз |
a{n,} |
a n или более раз |
a{n,m} |
a от n до m |
Существует еще два типа квантификаторов, которые образованы прибавлением суффикса ? (слабое, или неполное совпадение) или + («жадное», или собственное совпадение) к вышеперечисленным квантификаторам. Неполное совпадение соответствует выбору с наименее возможным количеством символов, а собственное – с максимально возможным.
Класс Pattern используется для простой обработки строк. Для более сложной обработки строк используется класс Matcher, рассматриваемый ниже.
В классе Pattern объявлены следующие методы:
Pattern compile(String regex) – возвращает Pattern, который соответствует regex.
Matcher matcher(CharSequence input) – возвращает Matcher, с помощью которого можно находить соответствия в строке input.
boolean matches(String regex, CharSequence input) – проверяет на соответствие строки input шаблону regex.
String pattern() – возвращает строку, соответствующую шаблону.
String[] split(CharSequence input) – разбивает строку input, учитывая, что разделителем является шаблон.
String[] split(CharSequence input, int limit) – разбивает строку input на не более чем limit частей.
С помощью метода matches() класса Pattern можно проверять на соответствие шаблону целой строки, но если необходимо найти соответствия внутри строки, например, определять участки, которые соответствуют шаблону, то класс Pattern не может быть использован. Для таких операций необходимо использовать класс Matcher.
Начальное состояние объекта типа Matcher не определено. Попытка вызвать какой-либо метод класса для извлечения информации о найденном соответствии приведет к возникновению ошибки IllegalStateException. Для того чтобы начать работу с объектом Matcher, нужно вызвать один из его методов:
boolean matches() – проверяет, соответствует ли вся строка шаблону;
boolean lookingAt() – пытается найти последовательность символов, начинающуюся с начала строки и соответствующую шаблону;
boolean find() или boolean find(int start) – пытается найти последовательность символов, соответствующих шаблону, в любом месте строки. Параметр start указывает на начальную позицию поиска.
Иногда необходимо сбросить состояние Matcher’а в исходное, для этого применяется метод reset() или reset(CharSequence input), который также устанавливает новую последовательность символов для поиска.
Для замены всех подпоследовательностей символов, удовлетворяющих шаблону, на заданную строку можно применить метод replaceAll(String replacement).
Для того чтобы ограничить поиск границами входной последовательности, применяется метод region(int start, int end), а для получения значения этих границ – regionEnd() и regionStart(). С регионами связано несколько методов:
Matcher useAnchoringBounds(boolean b) – если установлен в true, то начало и конец региона соответствуют символам ^ и $ соответственно.
boolean hasAnchoringBounds() – проверяет закрепленность границ.
В регулярном выражении для более удобной обработки входной последовательности применяются группы, которые помогают выделить части найденной подпоследовательности. В шаблоне они обозначаются скобками “(“ и “)”. Номера групп начинаются с единицы. Нулевая группа совпадает со всей найденной подпоследовательностью. Далее приведены методы для извлечения информации о группах.
int end() – возвращает индекс последнего символа подпоследовательности, удовлетворяющей шаблону;
int end(int group) – возвращает индекс последнего символа указанной группы;
String group() – возвращает всю подпоследовательность, удовлетворяющую шаблону;
String group(int group) – возвращает конкретную группу;
int groupCount() – возвращает количество групп;
int start() – возвращает индекс первого символа подпоследовательности, удовлетворяющей шаблону;
int start(int group) – возвращает индекс первого символа указанной группы;
boolean hitEnd() – возвращает истину, если был достигнут конец входной последовательности.
Следующий пример показывает как можно использовать возможности классов Pattern и Matcher для поиска, разбора и разбивки строк.
/* пример # 14 : обработка строк с помощью шаблонов :DemoRegular.java */
package chapt07;
import java.util.regex.*;
public class DemoRegular {
public static void main(String[] args) {
//проверка на соответствие строки шаблону
Pattern p1 = Pattern.compile("a+y");
Matcher m1 = p1.matcher("aaay");
boolean b = m1.matches();
System.out.println(b);
//поиск и выбор подстроки, заданной шаблоном
String regex =
"(\\w+)@(\\w+\\.)(\\w+)(\\.\\w+)*";
String s =
"адреса эл.почты:mymail@tut.by и rom@bsu.by";
Pattern p2 = Pattern.compile(regex);
Matcher m2 = p2.matcher(s);
while (m2.find())
System.out.println("e-mail: " + m2.group());
//разбивка строки на подстроки с применением шаблона в качестве разделителя
Pattern p3 = Pattern.compile("\\d+\\s?");
String[] words =
p3.split("java5tiger 77 java6mustang");
for (String word : words)
System.out.println(word);
}
}
В результате будет выведено:
true
e-mail: mymail@tut.by
e-mail: rom@bsu.by
java
tiger
java
mustang
Следующий пример показывает, как использовать группы, а также собственные и неполные квантификаторы.
/* пример # 15 : группы и квантификаторы : Groups.java */
package chapt07;
public class Groups {
public static void main(String[] args) {
String input = "abdcxyz";
myMatches("([a-z]*)([a-z]+)", input);
myMatches("([a-z]?)([a-z]+)", input);
myMatches("([a-z]+)([a-z]*)", input);
myMatches("([a-z]?)([a-z]?)", input);
}
public static void myMatches(String regex,
String input) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
System.out.println("First group: "
+ matcher.group(1));
System.out.println("Second group: "
+ matcher.group(2));
} else
System.out.println("nothing");
System.out.println();
}
}
Результат работы программы:
First group: abdcxy
Second group: z
First group: a
Second group: bdcxyz
First group: abdcxyz
Second group:
nothing
В первом случае к первой группе относятся все возможные символы, но при этом остается минимальное количество символов для второй группы.
Во втором случае для первой группы выбирается наименьшее количество символов, т. к. используется слабое совпадение.
В третьем случае первой группе будет соответствовать вся строка, а для второй не остается ни одного символа, так как вторая группа использует слабое совпадение.
В четвертом случае строка не соответствует регулярному выражению, т. к. для двух групп выбирается наименьшее количество символов.
В классе Matcher объявлены два полезных метода для замены найденных подпоследовательностей во входной строке.
Matcher appendReplacement(StringBuffer sb, String replacement) – метод читает символы из входной стоки и добавляет их в sb. Чтение останавливается на start()-1 позиции предыдущего совпадения, после чего происходит добавление в sb строки replacement. При следующем вызове этого метода производится добавление символов, начиная с символа с индексом end() предыдущего совпадения.
StringBuffer appendTail(StringBuffer sb) – добавляет оставшуюся часть символов из входной последовательности в sb. Как правило, вызывается после одного или нескольких вызовов метода appendReplacement().