Объектно-ориентированное программирование. Collections Framework. (Занятие 7)

Содержание

Слайд 2

План лекции Collection Framework Типы коллекций Параметризованные типы Параметризованные методы Автоупаковка/автораспаковка

План лекции

Collection Framework
Типы коллекций
Параметризованные типы
Параметризованные методы
Автоупаковка/автораспаковка

Слайд 3

Коллекции Коллекции (контейнеры) – хранилища, поддерживающие разнообразные способы накопления и упорядочивания

Коллекции

Коллекции (контейнеры) – хранилища, поддерживающие разнообразные способы накопления и упорядочивания объектов с

целью обеспечения возможностей эффективного доступа к ним
В Java коллекции разделены на интерфейсы, абстрагирующие общие принципы работы с коллекциями, и классы, реализующие конкретную функциональность
Не все методы, заявленные в интерфейсах, должны в действительности реализовываться классами. Часть методов может просто выбрасывать исключение UnsupportedOperationException
Слайд 4

Интерфейс Collection Является образующим для интерфейсов коллекций Определяет базовую функциональность любой

Интерфейс Collection

Является образующим для интерфейсов коллекций
Определяет базовую функциональность любой коллекции
Подразумевает добавление,

удаление, выбор элементов в коллекции
Допускает дубликаты и пустые элементы
Слайд 5

Методы интерфейса Collection Добавление элементов boolean add(Object o), boolean addAll(Collection c)

Методы интерфейса Collection

Добавление элементов boolean add(Object o), boolean addAll(Collection c)
Исключение элементов boolean

remove(Object o), boolean removeAll(Collection c), boolean retainAll(Collection c), void clear()
Состояние коллекции boolean contains(Object o), boolean containsAll(Collection c), boolean isEmpty(), int size()
Вспомогательные методы Object[] toArray(), Iterator iterator()
Слайд 6

Интерфейс Set Расширяет интерфейс Collection Не разрешает наличие дубликатов Допускается наличие

Интерфейс Set

Расширяет интерфейс Collection
Не разрешает наличие дубликатов
Допускается наличие только одной ссылки

null
Объекты коллекции должны корректно реализовывать метод equals()
Слайд 7

Интерфейс List Расширяет интерфейс Collection Подразумевает хранение упорядоченной последовательности объектов Порядок

Интерфейс List

Расширяет интерфейс Collection
Подразумевает хранение упорядоченной последовательности объектов
Порядок хранения определяется порядком

добавления элементов
Позволяет обращаться к элементам по их номеру
Слайд 8

Специальные методы интерфейса List Адресное добавление void add(int index, Object o),

Специальные методы интерфейса List

Адресное добавление void add(int index, Object o), boolean

addAll(int index, Collection c)
Адресные операции с элементами Object get(int index), Object set(int index, Object o), Object remove(int index)
Операции поиска int indexOf(Object o), int lastIndexOf(Object o)
Специальные операции List subList(int from, int to), ListIterator listIterator()
Слайд 9

Интерфейс Iterator Позволяет работать с коллекцией как с набором (серией) элементов:

Интерфейс Iterator

Позволяет работать с коллекцией как с набором (серией) элементов:
Получать следующий

объект Object next()
Проверять наличие следующего объекта boolean hasNext()
Исключать объект из коллекции void remove()
Слайд 10

Интерфейс Map Не расширяет интерфейс Collection Подразумевает хранение набора объектов парами

Интерфейс Map

Не расширяет интерфейс Collection
Подразумевает хранение набора объектов парами ключ/значение
Ключи должны

быть уникальными
Порядок следования пар ключ/значение не определен
Имеет расширение SortedMap, требующее упорядоченности по значениям ключей
Слайд 11

Методы интерфейса Map Добавление объектов Object put(Object key, Object value), void

Методы интерфейса Map

Добавление объектов Object put(Object key, Object value), void putAll(Map t)
Исключение

объектов Object remove(Object key), void clear()
Доступ к объекту по ключу Object get(Object key)
Состояние boolean containsValue(Object value), boolean containsKey(Object key), int size(), boolean isEmpty()
Преобразование типа Set entrySet(), Set keySet(), Collection values()

Java Map

Слайд 12

Некоторые классы коллекций Динамические массивы ArrayList (List), Vector (List) Двухсвязный список

Некоторые классы коллекций

Динамические массивы ArrayList (List), Vector (List)
Двухсвязный список LinkedList (List)
Упорядоченные множество и

карта TreeSet (Set), TreeMap (StoredMap)
Ряд других классов HashMap (Map), HashSet (Set)
Слайд 13

Класс Collections Содержит ряд статических методов прикладного назначения, позволяющих оперировать объектами

Класс Collections

Содержит ряд статических методов прикладного назначения, позволяющих оперировать объектами коллекций
Группы

методов:
Создание и поддержка оберток коллекций
Прочие прикладные методы
Слайд 14

Обертки коллекций Синхронизированные Обеспечивают механизмы синхронизации доступа для многопоточных приложений List

Обертки коллекций

Синхронизированные
Обеспечивают механизмы синхронизации доступа для многопоточных приложений
List synchronizedList(List l), …
Неизменяемые
Запрещают

использование методов модификации значений
Map unmodifiableMap(Map m), …
Слайд 15

Прикладные методы Методы поиска минимума и максимума min(), max() Работа со

Прикладные методы

Методы поиска минимума и максимума min(), max()
Работа со списками reverse(), shuffle(), fill(),

copy(), nCopies()
Сортировка списков sort()
Поиск элементов в списке binarySearch()
Прочие прикладные методы
Слайд 16

Обновленные коллекции (Java 5) Все интерфейсы коллекций стали параметризованными Включая итераторы!

Обновленные коллекции (Java 5)

Все интерфейсы коллекций стали параметризованными
Включая итераторы!
Все классы коллекций

стали параметризованными
Обновился класс java.util.Collections
Прежние методы модифицированы для работы с параметризованными типами
Появились новые методы
Появился новый тип оболочек (Checked), динамически обеспечивающих безопасность типов при работе с коллекцией
Слайд 17

Параметризованные типы Параметризованные типы (настраиваемые типы, generic types) Позволяют создавать классы,

Параметризованные типы

Параметризованные типы (настраиваемые типы, generic types)
Позволяют создавать классы, интерфейсы и

методы, в которых тип обрабатываемых данных задается как параметр
Позволяют создавать более компактный код, чем универсальные (обобщенные) типы, использующие ссылки типа Object
Обеспечивают автоматическую проверку и приведение типов
Позволяют создавать хороший, годный повторно используемый код
Слайд 18

Скромный пример Пример класса Пример использования class Generic { T obj;

Скромный пример

Пример класса
Пример использования

class Generic {
T obj;
Generic(T o) {obj

= o;}
T getObj() {return obj;};
}

Generic iObj;
iObj = new Generic(33);
int i = iObj.getObj() + 10;

Слайд 19

Особенности параметризованных типов Использовать примитивные типы в качестве параметров-типов нельзя Если

Особенности параметризованных типов

Использовать примитивные типы в качестве параметров-типов нельзя
Если одинаковые настраиваемые

типы имеют различные аргументы, то это различные типы
Обеспечивается более жесткий контроль типов на стадии компиляции
Слайд 20

Общий синтаксис Объявление настраиваемого типа class имяКласса {...} Создание ссылки и

Общий синтаксис

Объявление настраиваемого типа
class имяКласса<список-формальных-параметров> {...}
Создание ссылки и объекта настраиваемого типа
имяКласса<список-фактических-параметров>

имяПеременной = new имяКласса<список-фактических-параметров>(список-аргументов);

class Generic2 {...}

Generic2 gObj = new
Generic2(10, "ok");

Слайд 21

Ограниченные типы Ограничение типа позволяет использовать у ссылок методы и поля,

Ограниченные типы

Ограничение типа позволяет использовать у ссылок методы и поля, доступные

в типе-ограничителе
Типы, не наследующие от указанного, не могут быть использованы при создании объектов
Как имя типа может быть указан интерфейс!!!
Как имя типа может быть указан ранее введенный параметр!!!

class Stats {
T[] nums;
Stats(T[] o) {nums = o;}
double average() {
double sum = 0.0;
for(int i = 0; i < nums.length; i++)
sum += nums[i].doubleValue();
return sum / nums.length;
}
}

class Generic3> {...}

Слайд 22

Метасимвольный аргумент Что делать при передаче экземпляров параметризованных типов в методы,

Метасимвольный аргумент

Что делать при передаче экземпляров параметризованных типов в методы, т.е.

как писать сигнатуру?
Для этого используется метасимвол, обозначающий произвольный тип-параметр

class Generic {
...
boolean compare(Generic o) {
return o.getObj() == obj;
}

Слайд 23

Метасимвол с ограничениями Ограничение сверху Тип super допускается Ограничение снизу Тип sub не допускается

Метасимвол с ограничениями

Ограничение сверху

Тип super допускается
Ограничение снизу

Тип

sub не допускается
Слайд 24

Параметризованные методы Методы могут иметь собственные типы-параметры Фактические аргументы, передаваемые в

Параметризованные методы

Методы могут иметь собственные типы-параметры
Фактические аргументы, передаваемые в формальные аргументы,

имеющие тип-параметр, будут проверяться на соответствие типу, причем на этапе компиляции
Пример метода
Пример использования

public static > T min(T[] v) {
T min = v[0];
for (int i = 1; i < v.length; i++)
if (min.compareTo(v[i]) > 0)
min = v[i];
return min;
}

System.out.println(min(new Integer[] {10, 15, 5}));

Слайд 25

Ряд особенностей Конструкторы могут быть параметризованными (даже если сам класс таковым

Ряд особенностей

Конструкторы могут быть параметризованными (даже если сам класс таковым не

является)
Интерфейсы могут быть параметризованными
Нельзя создавать объекты, используя типы-параметры
Статические члены класса не могут использовать его типы-параметры
Настраиваемый класс не может расширять класс Throwable
От настраиваемых типов можно наследовать, есть ряд особенностей
Слайд 26

Ряд особенностей Нельзя создать массив типа-параметра Массивов элементов конкретной версии параметризованного

Ряд особенностей

Нельзя создать массив типа-параметра
Массивов элементов конкретной версии параметризованного типа не

бывает

class Generic {
T[] vals; //OK
Generic(T[] nums) {
//vals = new T[10]; //Не есть правильно!
vals = nums; //OK
}
}

//Generic[] gens = ew Generic[10];//Nicht OK
Generic[] gens = new Generic[10];

Слайд 27

И как же это работает? Механизм стирания В реальном байт-коде никаких

И как же это работает?

Механизм стирания
В реальном байт-коде никаких настраиваемых типов

в целом-то и нет…
Информация о настраиваемых типах удаляется на стадии компиляции
Именно компилятор осуществляет контроль безопасности приведения типов
А внутри после компиляции все те же «обобщенные» классы, явные приведения типов и прочее, и прочее…
Слайд 28

Ошибки неоднозначности «Логически правильный» код Оказывается неверным с точки зрения компилятора

Ошибки неоднозначности

«Логически правильный» код
Оказывается неверным с точки зрения компилятора
И это –

самый простой пример…

public class Test {
T first(T[] arr) {
return arr[0];
}
Object first(Object[] arr) {
return arr[0];
}
}

Test.java:6: first(T[]) is already defined in Test
Object first(Object[] arr) {
^

Слайд 29

Автоупаковка и автораспаковка Автоупаковка – процесс автоматической инкапсуляции данных простого типа

Автоупаковка и автораспаковка

Автоупаковка – процесс автоматической инкапсуляции данных простого типа в

экземпляр соответствующего ему класса-обертки в случаях, когда требуется значение ссылочного типа
Автораспаковка – процесс автоматического извлечения примитивного значения из объекта-упаковки в случаях, когда требуется значение примитивного типа

List list = new LinkedList();
list.add(1);
int b = (Integer)list.get(0) + 10;

Слайд 30

Особенности автоупаковки Происходит при присваивании, вычислении выражений и при передаче параметров

Особенности автоупаковки

Происходит при присваивании, вычислении выражений и при передаче параметров
Объекты создаются

без использования ключевого слова new
Объекты создаются!
Автоупаковка требует существенных ресурсов
Злоупотреблять автоупаковкой вообще не стоит!

Integer i = 15;

Слайд 31

Спасибо за внимание!

Спасибо за внимание!