
- •Эволюция методологий программирования. Парадигмы программирования.
- •III семестр
- •Основные определения.
- •IV семестр (ответы на вопросы к экзамену по java freebrain.Ru)
- •1. Виртуальная машина Java. Структура программ. Типы переменных в Java. Принципы работы ClassLoader.
- •2. Средства абстракции Java
- •3. Внутренние и вложенные классы Java
- •4. Средства инкапсуляции Java. Поддержка модульности. Пакеты
- •5. Иерархические отношения в Java
- •6. Агрегация и зависимость от времени жизни. Реализация отношений клиент-сервер. Стандартные контейнеры.
- •7. Типизация. Правила преобразования типов. Instanceof и ClassCastException. Класс Class.
- •8. Средства поддержки параллелизма. Активные и пассивные объекты. Класс Object
- •9. Использование Thread и Runnable. Пул потоков, назначение и принципы реализации
- •10. Исключения. Обработка исключительных ситуаций
- •11. Сохраняемость. Serializable и Externalizable. Программирование распределенных приложений
- •12. Модель безопасности Java. Policy, Permissions, AccessController
- •14. Средства поддержки Java машины. System, Runtime, сборка мусора
6. Агрегация и зависимость от времени жизни. Реализация отношений клиент-сервер. Стандартные контейнеры.
Объекты образуют агрегационные иерархии (отнош. «part of»). Физически, агрегация может быть реализована как с помощью композиции, так и с помощью ассоциации (связи). При композиционном отношении между объектами сущ. зависимость по времени жизни: агрегат-часть не может сущ. без агрегата-целого. При ассоциативном отношении объекты могут сущ. независимо друг от друга по времени жизни. В Java безусловная композиция прис. только в отношениях между объектом и его «immediately enclosing instance» ранга >=1. Экземпляр внутреннего класса не может сущ. вне контекста внешнего класса. В ост. случаях физически отнош. явл-ся ассоциативными (по ссылке), гарантированной связи по времени жизни нет, время уничт. объектов опр-ся логикой работы сборщика мусора.
Одной из самых распространенных концепций распределенной обработки данных является модель типа «клиент/сервер». В этой модели программа разбивается на две части: одна часть называется сервером, а другая — клиентом. Связь между ними означает, что клиент нуждается в услугах сервера, то есть операции класса-клиента вызывают операции класса-сервера или имеют сигнатуру, в которой возвращаемое значение или аргументы принадлежат классу сервера.
Для того, чтобы объект-клиент мог вызвать метод объекта-сервера, необходимо, чтобы сервер был «видим» для клиента, и клиент должен знать о контракте, предоставляемом сервером. Инф. о контракте задается типом (классом или интерф.) переменной (ссылки, указателя), через которую сервер доступен клиенту. Сущ. четыре способа обеспечения видимости: - сервер имеет глобальную видимость по отнош. к клиенту; - сервер передан клиенту в кач-ве параметра операции (метода); - сервер явл-ся частью клиента; - сервер локально порождается клиентом в ходе выполнения какой-либо операции. В Java видимость обеспеч. с помощью ссылки на объект-сервер, которая может хранится в переменной ссылочного типа, м.б. получена как рез-т вызова метода, может явл-ся рез-том вычисления выражений (String, +), либо исп. неявно при вызове метода сервера, который явл-ся «immediately enclosing instance of» объекта-клиента.
Библиотека контейнеров содержит единственный класс - “контейнер”, который ведет себя и как линейная последовательность, и как ассоциированный массив одновременно. Библиотека контейнеров Java 2 принимается за проблему “хранения объектов” и делит ее на две отдельные концепции: 1) Коллекция: группа индивидуальных элементов, часто с определенными правилами, применяемыми к элементам. Список должен хранить элементы в определенной последовательности, а Набор не может иметь дублирующиеся элементы. 2) Карта: группа объектных пар ключ - значение. Карта может возвращать Набор своих ключевых значений, Коллекцию своих значений или Набор своих пар. Карты, как и массивы, могут иметь несколько измерений без добавления новой концепции: просто создается Карта, чьими значениями являются другие карты.
Различие основывается на числе элементов, содержащихся в каждой ячейке контейнера. Категория Collection (коллекция) хранит только один элемент в каждой ячейке. Сюда включается List (список), который хранит группы элементов в указанном порядке, и Set (набор), который позволяет добавление одного элемента каждого типа. ArrayList - это тип List, а HashSet - это тип Set. Для добавление элементов в любой из Collection существует метод add( ). Map (карта) хранит пары ключ-значение. Для добавления элемента в Map существует метод put( ), который принимает ключ и значение в качестве аргументов. Перегруженный метод fill( ) заполняет Collection и Map, соответственно.
В поведении разных контейнеров сущ. различия. List хранит объекты точно так, как они были введены, без изменения порядка или редактирования. Однако Set принимает по одному экземпляру каждого объекта и использует свой внутренний метод. Map тоже принимает только по одному значению для каждого элемента, основываясь на ключе, и он также имеет свое собственное внутреннее упорядочивание и не заботится о том порядке, в котором вводили элементы. “Неудобство” при использовании контейнеров Java в том, что теряется информация о типе, когда объект помещается в контейнер. Контейнер содержит ссылки на Object, который является корнем всех классов, так что он содержит любой тип (кроме примитивных). Т.к. информация о типе отбрасывается, когда ссылку на объект помещается в контейнер, нет ограничений на тип объекта, который может быть помещен в контейнер. Контейнер знает только ссылки на объекты. Необходимо выполнить приведение к правильному типу перед использованием объекта. С другой стороны, Java не позволит неправильно использовать объект, который вы поместили в контейнер.
От Collection берут свое начало (Интерфейсы): List – список, Set – множество. Map реализуется через: HashMap - хеш таблица, TreeMap - является SortedMap(интерфейс) т.е. все элементы отсортированны (красно-черные деревья).
List релизуется через: ArrayList - список на основе массива (Vector), LinkedList - потомок AbstractSequentialList - двух сторонний связанный список, на нем разлизуются также структуры Stak, Queue, Deq
Set реализуется через: HashSet - хешированное множество, TreeSet - является SortedSet(интерфейс) - отсортированное множество (красно-черное дерево).
Спуск от интерфейса всегда проходить через абстрактный класс, например LinkedList: {Collection}->{List}->[AbstractList]->[AbstractSequentialList]->LinkedList
При создании новой структуры следует наследовать ее от абстрактного базового класса, даже если переопределены все его методы.
Для списков с быстрым доступом используют ArrayList, а там где много вставок и удалений LinkedList. Множество (только уникальные элементы). Наиболее часто выбирется HashSet. TreeSet используется редко, когда нужно отсортированное множество.
Если нужно последовательно работать с элементами контейнера то нужно ВСЕГДА использовать Iterator. Это особенно актуально для LinkedList. Метод get(int index) всегда начинает поиск элемента от низа(начала, заголовка) списка сложность Q(индех), в то время как Iterator хранит свою позицию Q(1). Все итераторы реализованы вложенным классом, а потому используют одни и те же данные с контейнером. HashMap это ассоциативный массив (хеш таблица). Не заменим в ситуациях ключ->значение. TreeMap хранит все элементы отсортированными.
Если вы используется свой Объект как ключ в Map или исп. HashSet, следует позаботиться о правильном хешировании.