Collections Framework
План лекции
Коллекции
Интерфейс Collection
Методы интерфейса Collection
Интерфейс Set
Интерфейс List
Специальные методы интерфейса List
Интерфейс Iterator
Интерфейс Map
Методы интерфейса Map
Некоторые классы коллекций
Класс Collections
Обертки коллекций
Прикладные методы
Обновленные коллекции (Java 5)
Параметризованные типы
Скромный пример
Особенности параметризованных типов
Общий синтаксис
Ограниченные типы
Метасимвольный аргумент
Метасимвол с ограничениями
Параметризованные методы
Ряд особенностей
Ряд особенностей
И как же это работает?
Ошибки неоднозначности
Автоупаковка и автораспаковка
Особенности автоупаковки
Спасибо за внимание!
Дополнительные источники
519.68K
Category: programmingprogramming

Объектно-ориентированное программирование. 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
English     Русский Rules