Скачать презентацию Лекция 5 Collections API Лекции по Java SE Скачать презентацию Лекция 5 Collections API Лекции по Java SE

05-Collections.pptx

  • Количество слайдов: 27

Лекция 5. Collections API Лекции по Java SE Максим Букасов, киевский учебный центр Net. Лекция 5. Collections API Лекции по Java SE Максим Букасов, киевский учебный центр Net. Cracker © 2013 Net. Cracker Technology Corporation Confidential

План лекции • Общие сведения о коллекциях • Основные интерфейсы Collections framework • Set, План лекции • Общие сведения о коллекциях • Основные интерфейсы Collections framework • Set, Tree. Set, Hash. Set • Хеширование • List, Array. List, Linked. List • Просмотр коллекций • Generic-типы и типизированные коллекции • Random. Access • Sub. List, Sub. Set • Коллекции в JDK 1. 0 © 2013 Net. Cracker Technology Corporation Confidential 2

Общие сведения о коллекциях • Коллекции предназначены для хранения ссылок на объекты • именно Общие сведения о коллекциях • Коллекции предназначены для хранения ссылок на объекты • именно ссылок (сами объекты хранятся не в коллекциях, а в куче) • именно на объекты (данные примитивных типов храниться в коллекциях не могут) • Коллекции VS Массивы Коллекции Объекты и примитивы Только объекты Фиксированный размер Размер меняется динамически Самый быстрый Random Access Наличие Random Access, способ и время доступа зависит от типа коллекции Реализованы на уровне языка Реализованы как библиотека классов и интерфейсов (java. util. *). Некоторые конструкции языка «умеют» работать с коллекциями. © 2013 Net. Cracker Technology Corporation Confidential 3

Коллекции • Collections framework (начиная с Java 1. 2) • Рекомендуется использовать именно их Коллекции • Collections framework (начиная с Java 1. 2) • Рекомендуется использовать именно их • Будут подробно описаны ниже • Устаревшие (начиная с Java 1. 0) • Их нужно знать, т. к. в некоторых книгах/исходниках все еще встречаются такие классы как: ‒ Vector ‒ Stack ‒ Hashtable ‒ Enumeration © 2013 Net. Cracker Technology Corporation Confidential 4

Основные интерфейсы Collections framework Collection Set List Sorted. Set Map Queue Sorted. Map Deque Основные интерфейсы Collections framework Collection Set List Sorted. Set Map Queue Sorted. Map Deque • Collection – хранят ссылки на объекты • Map – хранят пары ключ-значение (ассоциативные массивы) • Collection, Set, Sorted. Set, List, Map, Sorted. Map – начиная с Java 1. 2 и выше • Queue – начиная с Java 1. 5 и выше • Deque – начиная с Java 1. 6 и выше © 2013 Net. Cracker Technology Corporation Confidential 5

Интерфейс Collection • Collection – базовый интерфейс для всех коллекций (кроме ассоциативных массивов) • Интерфейс Collection • Collection – базовый интерфейс для всех коллекций (кроме ассоциативных массивов) • Применяется когда нужно передавать коллекции максимально обобщенно, не привязываясь к их типу (Set / List / Queue / Deque /. . . ) • Операции: • Изменение ‒ add, remove, clear • Просмотр ‒ is. Empty, size, contains, iterator • Групповые операции ‒ add. All (объединение) ‒ remove. All (вычитание) ‒ retain. All (пересечение) ‒ contains. All (определяет является ли коллекция подмножеством другой коллекции) • Преобразование в массив ‒ to. Array © 2013 Net. Cracker Technology Corporation Confidential 6

Интерфейс Set • Не допускает добавления дубликатов • Используйте только для immutable объектов! • Интерфейс Set • Не допускает добавления дубликатов • Используйте только для immutable объектов! • Является наследником Collection, все методы такие же как в Collection ‒ получив ссылку типа Collection с помощью instanceof Set можно заранее убедиться в отсутствии дубликатов в коллекции • Представляет собой математическое понятие «множество» ‒ ‒ add. All (объединение множеств) remove. All (вычитание множеств) retain. All (пересечение множеств) contains. All (определяет является ли коллекция подмножеством другой коллекции) • Порядок элементов при просмотре как правило не гарантируется ‒ Sorted. Set (интерфейс) – при просмотре элементы возвращаются упорядочено в соответствии с их natural ordering или заданным Comparator ‒ Linked. Hash. Set (класс) – при просмотре элементы возвращаются в том порядке, в котором они добавлялись в коллекцию • Реализации: Tree. Set, Hash. Set, Linked. Hash. Set, . . . © 2013 Net. Cracker Technology Corporation Confidential 7

Класс Tree. Set • Дубликаты не добавляются (implements Set) • Используется двоичный поиск. Трудоемкость Класс Tree. Set • Дубликаты не добавляются (implements Set) • Используется двоичный поиск. Трудоемкость O(log 2 N) • Элементы хранятся/просматриваются упорядоченно (implements Sorted. Set) • Для этого нужно иметь возможность сравнивать их друг с другом: ‒ natural ordering (implements Comparable) ‒ null не допускается ‒ Comparator ‒ null допускается, если разрешено компаратором; но нужно быть осторожным, т. к. некоторые методы Tree. Set, Navigable. Set возвращают null как специальное значение • Способ сравнения задается конструктором Tree. Set • При попытке добавления объектов несравнимых друг с другом – Exception • При работе с не immutable объектами возможны неприятные сюрпризы • implements Serializable, Cloneable • implements Navigable. Set (начиная с Java 1. 6) © 2013 Net. Cracker Technology Corporation Confidential 8

Класс Tree. Set - пример import java. util. *; public class Tree. Set. Demo{ Класс Tree. Set - пример import java. util. *; public class Tree. Set. Demo{ public static void main(String[] args) { Set set = new Tree. Set(); set. add("one"); set. add("two"); set. add("three"); set. add("four"); set. add("one"); set. add("two"); // try this: //set. add(new Integer(1)); // Exception. String cannot be compared to Integer //set. add(null); // Null. Pointer. Exception // check order (alphabetical for String) and duplicates (none) System. out. println(set); } } output: [four, one, three, two] © 2013 Net. Cracker Technology Corporation Confidential 9

Класс Hash. Set • Дубликаты не допускаются (implements Set) • При поиске и добавлении Класс Hash. Set • Дубликаты не допускаются (implements Set) • При поиске и добавлении используется хеширование (не путать с кешированием) • Порядок при просмотре – непредсказуем (зависит от порядка записи, алгоритма и параметров хеширования) • Допускается запись значения null • Допускается добавление объектов различных типов • При работе с не immutable объектами возможны неприятные сюрпризы • implements Serializable • implements Cloneable © 2013 Net. Cracker Technology Corporation Confidential 10

Хеширование • Хеширование предназначено для ускорения поиска • Пример хеширования – телефонная книга: ‒ Хеширование • Хеширование предназначено для ускорения поиска • Пример хеширования – телефонная книга: ‒ при записи – пишем на нужную страницу ‒ при поиске – просматриваем ТОЛЬКО нужную страницу ‒ если есть – нашли быстро ‒ если на нужной странице нет – значит нет нигде, прекращаем поиск • Хеш-функция – алгоритм, по которому на основании состояния объекта вычисляется его хеш-код • Хеш-код – значение, определяющее на какую «страницу» нужно записать ссылку на объект внутри коллекции ‒ в данном случае в качестве хеш-кода выступает первая буква имени ‒ это не очень хорошая функция (по статистике на некоторые буквы имен много, на некоторые – мало) ‒ хорошая хеш-функция обеспечивает равномерное распределение хеш-кодов © 2013 Net. Cracker Technology Corporation Confidential 11

Требования к equals и hash. Code • equals Рефлексивность x. equals(x) == true Симметричность Требования к equals и hash. Code • equals Рефлексивность x. equals(x) == true Симметричность Если x. equals(y) == true, то y. equals(x) == true Транзитивность Если x. equals(y) == true, и y. equals(z) == true, то x. equals(z) == true Консистентность Множественные вызовы x. equals(y) должны возвращать или все время true или все время false, если объекты x и y не изменялись Сравнение с null x. equals(null) == false • hash. Code ОБЯЗАТЕЛЬНО Множественные вызовы x. hash. Code() должны возвращать одно и то же значение если объект x не изменялся (это значение может изменяться при перезапуске программы) ОБЯЗАТЕЛЬНО Если x. equals(y) == true, то x. hash. Code() == y. hash. Code() ЖЕЛАТЕЛЬНО Если x. equals(y) == false, то x. hash. Code() != y. hash. Code() © 2013 Net. Cracker Technology Corporation Confidential 12

Пример хеш-функций • Допустим есть такой класс: class Point { int x; // x Пример хеш-функций • Допустим есть такой класс: class Point { int x; // x = 0. . 100 int y; // y = 0. . 100. . . public int hash. Code() { return. . . } } Хорошая хеш-функция: - быстро вычисляется - низкий % коллизий Неправильная хеш-функция (int)(Math. random()*100); Правильная, но плохая 42; // все объекты в одно ведро Не очень хорошая x+y; // у некоторых объектов будут совпадать Хорошая x << 16 ^ y; // у разных объектов - разные © 2013 Net. Cracker Technology Corporation Confidential 13

Класс Hash. Set - пример import java. util. *; public class Hash. Set. Demo{ Класс Hash. Set - пример import java. util. *; public class Hash. Set. Demo{ public static void main(String[] args) { Set set = new Hash. Set(); // try Linked. Hash. Set set. add("one"); set. add("two"); set. add("three"); set. add("four"); set. add("one"); set. add("two"); // try this: //set. add(new Integer(1)); // No compare - no Exception //set. add(null); // No Null. Pointer. Exception // check order and duplicates System. out. println(set); } } © 2013 Net. Cracker Technology Corporation Confidential 14

Интерфейс List • Представляет собой «массив переменной длины» • Допускает хранения дубликатов и null Интерфейс List • Представляет собой «массив переменной длины» • Допускает хранения дубликатов и null • Является наследником Collection • Кроме этого имеет свои методы: ‒ ‒ ‒ get, set add, remove (по индексу) index. Of, last. Index. Of list. Iterator sub. List • Порядок элементов при просмотре гарантируется • Производительность вставки/удаления и произвольного доступа существенно зависит от реализации ‒ (см. ниже пример Array. List VS Linked. List) © 2013 Net. Cracker Technology Corporation Confidential 15

Класс Array. List • Реализует интерфейс List • На нижнем уровне реализован через обычный Класс Array. List • Реализует интерфейс List • На нижнем уровне реализован через обычный массив • Реализует маркерный интерфейс Random. Access • Дополнительно имеет такие методы: ‒ ensure. Capacity(int min. Capacity) ‒ trim. To. Size() • implements Serializable, Cloneable • Рекомендации: ‒ get, set работают очень быстро, можно пользоваться без проблем ‒ add, remove в середине коллекции приводят к сдвигу элементов. В больших коллекциях может тормозить ‒ add в конец коллекции работает быстро пока sizecapacity, создается новый массив большего размера и содержимое копируется в него. Если нужно добавлять большое количество элементов, лучше заранее вызвать ensure. Capacity(n) © 2013 Net. Cracker Technology Corporation Confidential 16

Класс Array. List – пример import java. util. *; public class Array. List. Demo Класс Array. List – пример import java. util. *; public class Array. List. Demo { public static void main(String[] args) { List list = new Array. List(); list. add(new Integer(1)); list. add(null); list. add("one"); list. add("two"); list. add("three"); list. add("four"); list. add("one"); list. add("two"); // check order, nulls, duplicates System. out. println(list); } } output: [1, null, one, two, three, four, one, two] © 2013 Net. Cracker Technology Corporation Confidential 17

Класс Linked. List • Реализует интерфейс Deque ‒ можно делать очереди типа FIFO или Класс Linked. List • Реализует интерфейс Deque ‒ можно делать очереди типа FIFO или FILO • На нижнем уровне реализован как двунаправленный связанный список • Не реализует маркерный интерфейс Random. Access • implements Serializable, Cloneable • Рекомендации: ‒ get, set работают медленно. Время работы зависит от того как далеко элемент находится от начала или конца списка (выбирается более короткий путь) ‒ add, remove в начало/конец списка работают очень быстро © 2013 Net. Cracker Technology Corporation Confidential 18

Интерфейс Iterator • Используется для просмотра элементов коллекций • У каждой коллекции есть свой Интерфейс Iterator • Используется для просмотра элементов коллекций • У каждой коллекции есть свой итератор с данным интерфейсом • Имеет такие методы: ‒ has. Next() ‒ next() ‒ remove() • Чаще всего используется с таким паттерном: List list = new Array. List(); list. add("1"); list. add("2"); list. add("3"); //. . . for (Iterator i = list. iterator(); i. has. Next(); ) { Object o = i. next(); // Do something with o System. out. println(o); } © 2013 Net. Cracker Technology Corporation Confidential 19

Цикл for-each • Начиная с Java 1. 5 появился цикл типа for-each • Транслируется Цикл for-each • Начиная с Java 1. 5 появился цикл типа for-each • Транслируется компилятором в код с обычным итератором (как на предыдущем слайде) • Не дает выигрыша в производительности (такой же байт-код) • Не позволяет удалять элементы при просмотре коллекции List list = new Array. List(); list. add("1"); list. add("2"); list. add("3"); //. . . for (Object o: list) { System. out. println(o); } © 2013 Net. Cracker Technology Corporation Confidential 20

Типизированные коллекции (слайд 1) • Java 1. 4: во время выполнения нужно выполнять проверки Типизированные коллекции (слайд 1) • Java 1. 4: во время выполнения нужно выполнять проверки и преобразования типов т. к. коллекции хранят ссылки на Object • Java 1. 5: появились Generic типы. Теперь проверкой типов занимается компилятор. Преобразований типов не требуется Java 1. 4 Java 1. 5 List list = new Array. List(); List list = new Array. List(); list. add("1"); list. add("2"); list. add("3"); for (String s: list) { for (Object o: list) { if (o instanceof String) { String s = (String) o; // Do something with string s System. out. println(s. length()); } } // Do something with string s System. out. println(s. length()); } © 2013 Net. Cracker Technology Corporation Confidential 21

Типизированные коллекции (слайд 2) • Пример с итератором: Java 1. 4 List list = Типизированные коллекции (слайд 2) • Пример с итератором: Java 1. 4 List list = new Array. List(); list. add("1"); list. add("2"); list. add("3"); for (Iterator i = list. iterator(); i. has. Next(); ) { Object o = i. next(); if (o instanceof String) { String s = (String) o; // Do something with string s System. out. println(s. length()); } } Java 1. 5 List list = new Array. List(); list. add("1"); list. add("2"); list. add("3"); for (Iterator i = list. iterator(); i. has. Next(); ) { String s = i. next(); // Do something with string s System. out. println(s. length()); } © 2013 Net. Cracker Technology Corporation Confidential 22

Интерфейс Random. Access • Random. Access – маркерный интерфейс (не содержит методов или констант) Интерфейс Random. Access • Random. Access – маркерный интерфейс (не содержит методов или констант) • Его наличие означает быструю работу методов произвольного доступа к элементам (по индексу) таких как get, set • Присутствует у Array. List, Stack, Vector • Отсутствует у Linked. List © 2013 Net. Cracker Technology Corporation Confidential 23

Интерфейс Random. Access - пример List<String> list 1 = new Array. List<String>(); List<String> list Интерфейс Random. Access - пример List list 1 = new Array. List(); List list 2 = new Linked. List(); // Заполнение коллекций // попробуйте 10, 1000, 100000 for (int i=0; i<10000; i++) { list 1. add("" + i); list 2. add("" + i); } // Random access test long t 0=System. nano. Time(); // get list 1 for (int i=0, n=list 1. size(); i

Sub. List, Sub. Set • Создание выборки из коллекции • Изменение выборки изменяет исходную Sub. List, Sub. Set • Создание выборки из коллекции • Изменение выборки изменяет исходную коллекцию List list = new Array. List(); list. add("a"); list. add("b"); list. add("c"); list. add("d"); list. add("e"); list. add("f"); System. out. println("list: " + list); List view = list. sub. List(2, 5); System. out. println("view: " + view); view. remove(1); System. out. println("view: " + view); System. out. println("list: " + list); © 2013 Net. Cracker Technology Corporation Confidential output: list: [a, b, c, d, e, f] view: [c, d, e] view: [c, e] list: [a, b, c, e, f] 25

Коллекции в JDK 1. 0 • Основные представители: • Vector – массив переменной длины. Коллекции в JDK 1. 0 • Основные представители: • Vector – массив переменной длины. Пользуйтесь Array. List • Stack – стек FILO. Пользуйтесь Deque • Hashtable – ассоциативный массив. Пользуйтесь Map ‒ не допускается null • Enumeration – просмотр коллекции. Пользуйтесь Iterator ‒ не позволяет удалять в процессе просмотра • Старые коллекции thread-safe. Это нужно не всегда. Когда не нужно – проигрывают новым коллекциям, в которых нет thread-safe-избыточности • Если нужен thread-safe – используйте утилитный класс Collections для получения thread-safe обертки ‒ Collections. synchronized. XXXXX(. . . ) © 2013 Net. Cracker Technology Corporation Confidential 26

Thank you! © 2013 Net. Cracker Technology Corporation Confidential 27 Thank you! © 2013 Net. Cracker Technology Corporation Confidential 27