Similar presentations:
Объектно-ориентированное программирование. Collections Framework. (Занятие 7)
1. Collections Framework
Самарский государственный аэрокосмический университетимени академика С.П. Королёва
Объектно-ориентированное
программирование
Collections Framework
Занятие 7
© Составление,
А.В. Гаврилов, 2014
А.П. Порфирьев, 2015
Самара
2015
2. План лекции
Collection FrameworkТипы коллекций
Параметризованные типы
Параметризованные методы
Автоупаковка/автораспаковка
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
2
3. Коллекции
Коллекции (контейнеры) – хранилища,поддерживающие разнообразные
способы накопления и упорядочивания
объектов с целью обеспечения
возможностей эффективного
доступа к ним
В Java коллекции разделены на интерфейсы, абстрагирующие
общие принципы работы с коллекциями, и классы,
реализующие конкретную функциональность
Не все методы, заявленные в интерфейсах, должны в
действительности реализовываться классами. Часть методов
может просто выбрасывать исключение
UnsupportedOperationException
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
3
4. Интерфейс Collection
Является образующим для интерфейсовколлекций
Определяет базовую функциональность
любой коллекции
Подразумевает добавление, удаление,
выбор элементов в коллекции
Допускает дубликаты и пустые элементы
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
4
5. Методы интерфейса 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()
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
5
6. Интерфейс Set
Расширяет интерфейс CollectionНе разрешает наличие дубликатов
Допускается наличие только одной ссылки
null
Объекты коллекции должны корректно
реализовывать метод equals()
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
6
7. Интерфейс List
Расширяет интерфейс CollectionПодразумевает хранение упорядоченной
последовательности объектов
Порядок хранения
определяется порядком
добавления элементов
Позволяет обращаться
к элементам по их номеру
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
7
8. Специальные методы интерфейса 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()
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
8
9. Интерфейс Iterator
Позволяет работать с коллекцией какс набором (серией) элементов:
Получать следующий объект
Object next()
Проверять наличие следующего объекта
boolean hasNext()
Исключать объект из коллекции
void remove()
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
9
10. Интерфейс Map
Не расширяет интерфейс CollectionПодразумевает хранение набора объектов
парами ключ/значение
Ключи должны быть уникальными
Порядок следования пар ключ/значение
не определен
Имеет расширение SortedMap,
требующее упорядоченности по значениям
ключей
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
10
11. Методы интерфейса 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()
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
Java Map
11
12. Некоторые классы коллекций
Динамические массивыArrayList (List), Vector (List)
Двухсвязный список
LinkedList (List)
Упорядоченные множество и карта
TreeSet (Set),
TreeMap (StoredMap)
Ряд других классов
HashMap (Map), HashSet (Set)
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
12
13. Класс Collections
Содержит ряд статических методовприкладного назначения, позволяющих
оперировать объектами коллекций
Группы методов:
Создание
Прочие
и поддержка оберток коллекций
прикладные методы
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
13
14. Обертки коллекций
СинхронизированныеОбеспечивают
механизмы синхронизации
доступа для многопоточных приложений
List synchronizedList(List l), …
Неизменяемые
Запрещают
использование методов
модификации значений
Map unmodifiableMap(Map m), …
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
14
15. Прикладные методы
Методы поиска минимума и максимумаmin(), max()
Работа со списками
reverse(), shuffle(), fill(), copy(),
nCopies()
Сортировка списков
sort()
Поиск элементов в списке
binarySearch()
Прочие прикладные методы
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
15
16. Обновленные коллекции (Java 5)
Все интерфейсы коллекцийстали параметризованными
Включая итераторы!
Все классы коллекций стали
параметризованными
Обновился класс java.util.Collections
Прежние методы модифицированы для работы с
параметризованными типами
Появились новые методы
Появился новый тип оболочек (Checked), динамически
обеспечивающих безопасность типов при работе с
коллекцией
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
16
17. Параметризованные типы
Параметризованные типы (настраиваемые типы,generic types)
Позволяют создавать классы, интерфейсы и методы, в
которых тип обрабатываемых данных задается как
параметр
Позволяют создавать более компактный код, чем
универсальные (обобщенные) типы, использующие
ссылки типа Object
Обеспечивают автоматическую проверку и приведение
типов
Позволяют создавать хороший, годный повторно
используемый код
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
17
18. Скромный пример
Пример классаclass Generic<T> {
T obj;
Generic(T o) {obj = o;}
T getObj() {return obj;};
}
Пример использования
Generic<Integer> iObj;
iObj = new Generic<Integer>(33);
int i = iObj.getObj() + 10;
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
18
19. Особенности параметризованных типов
Использовать примитивные типы вкачестве параметров-типов нельзя
Если одинаковые настраиваемые типы
имеют различные аргументы, то это
различные типы
Обеспечивается более жесткий контроль
типов на стадии компиляции
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
19
20. Общий синтаксис
Объявление настраиваемого типаclass имяКласса<список-формальных-параметров> {...}
class Generic2<T, E> {...}
Создание ссылки и объекта
настраиваемого типа
имяКласса<список-фактических-параметров>
имяПеременной = new имяКласса<список-фактическихпараметров>(список-аргументов);
Generic2<Integer, String> gObj = new
Generic2<Integer, String>(10, "ok");
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
20
21. Ограниченные типы
class Stats<T extends Number> {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<T extends Comparable<T>> {...}
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
21
22. Метасимвольный аргумент
Что делать при передаче экземпляровпараметризованных типов в методы, т.е.
как писать сигнатуру?
Для этого используется метасимвол,
обозначающий произвольный типпараметр
class Generic<T> {
...
boolean compare(Generic<?> o) {
return o.getObj() == obj;
}
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
22
23. Метасимвол с ограничениями
Ограничение сверху<? extends super>
Тип super допускается
Ограничение снизу
<? super sub>
Тип sub не допускается
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
23
24. Параметризованные методы
Методы могут иметь собственные типы-параметрыФактические аргументы, передаваемые в формальные
аргументы, имеющие тип-параметр, будут проверяться
на соответствие типу, причем на этапе компиляции
Пример метода
public static <T extends Comparable<T>> 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}));
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
24
25. Ряд особенностей
Конструкторы могут быть параметризованными (дажеесли сам класс таковым не является)
Интерфейсы могут быть параметризованными
Нельзя создавать объекты, используя типы-параметры
Статические члены класса не могут использовать его
типы-параметры
Настраиваемый класс не может расширять класс
Throwable
От настраиваемых типов можно наследовать, есть ряд
особенностей
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
25
26. Ряд особенностей
Нельзя создать массив типа-параметраclass Generic<T> {
T[] vals; //OK
Generic(T[] nums) {
//vals = new T[10]; //Не есть правильно!
vals = nums; //OK
}
}
Массивов элементов конкретной версии
параметризованного типа не бывает
//Generic<Integer>[] gens = ew Generic<Integer>[10];//Nicht OK
Generic<?>[] gens = new Generic<?>[10];
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
26
27. И как же это работает?
Механизм стиранияВ
реальном байт-коде никаких настраиваемых
типов в целом-то и нет…
Информация о настраиваемых типах
удаляется на стадии компиляции
Именно компилятор осуществляет контроль
безопасности приведения типов
А внутри после компиляции все те же
«обобщенные» классы, явные приведения
типов и прочее, и прочее…
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
27
28. Ошибки неоднозначности
«Логически правильный» кодpublic class Test <T> {
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) {
^
И это – самый простой пример…
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
28
29. Автоупаковка и автораспаковка
Автоупаковка – процесс автоматическойинкапсуляции данных простого типа в экземпляр
соответствующего ему класса-обертки в случаях,
когда требуется значение ссылочного типа
Автораспаковка – процесс автоматического
извлечения примитивного значения из объектаупаковки в случаях, когда требуется значение
примитивного типа
List list = new LinkedList();
list.add(1);
int b = (Integer)list.get(0) + 10;
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
29
30. Особенности автоупаковки
Происходит при присваивании, вычислениивыражений и при передаче параметров
Объекты создаются без использования
ключевого слова new
Integer i = 15;
Объекты создаются!
Автоупаковка требует существенных
ресурсов
Злоупотреблять автоупаковкой
вообще не стоит!
А.В. Гаврилов. А.П. Порфирьев. Collections Framework
30
31. Спасибо за внимание!
32. Дополнительные источники
Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, ДэвидХолмс. – М. : Издательский дом «Вильямс», 2001. – 624 с.
Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. :
Интернет-университет информационных технологий, 2003. – 592 с.
Хорстманн, К. Java 2. Библиотека профессионала. Том 1. Основы [Текст] / Кей
Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. – 816 с.
Хорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости программирования
[Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. –
992 с.
Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа:
http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа:
21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа:
http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата
доступа: 21.10.2011.
А.В. Гаврилов. А.П. Порфирьев. Collections Framework