2013 10 21_java_lecture_07

  • 1,638 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,638
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
9
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Стандартная библиотека Java: Collections Framework Алексей Владыкин 21 октября 2013 Алексей Владыкин Collections 21 октября 2013 1 / 44
  • 2. 1 Collections Framework 2 Generics Алексей Владыкин Collections 21 октября 2013 2 / 44
  • 3. Collections Framework Алексей Владыкин Общие сведения Collections 21 октября 2013 3 / 44
  • 4. Collections Framework Общие сведения Что такое коллекции Разнообразные контейнеры для хранения наборов объектов, более удобные, чем массивы Алексей Владыкин Collections 21 октября 2013 4 / 44
  • 5. Collections Framework Общие сведения Что такое коллекции Разнообразные контейнеры для хранения наборов объектов, более удобные, чем массивы добавление/удаление элементов запрет модификации коллекции операции поиска, объединения, вычитания индексация элементов произвольными объектами В отличие от массивов, могут хранить только объекты. Для примитивных типов — классы-обертки и autoboxing Пакет java.util Алексей Владыкин Collections 21 октября 2013 4 / 44
  • 6. Collections Framework Общие сведения java.util.Collection Базовый интерфейс для коллекций Основные операции: int size() boolean isEmpty() boolean contains(Object o) — использует equals boolean add(E e) boolean remove(Object o) void clear() Алексей Владыкин Collections 21 октября 2013 5 / 44
  • 7. Collections Framework Общие сведения java.util.Iterator Единообразный способ обхода элементов коллекции Операции: boolean hasNext() E next() void remove() Алексей Владыкин Collections 21 октября 2013 6 / 44
  • 8. Collections Framework Общие сведения Использование итератора // foreach syntax for ( E element : collection ) { System . out . println ( element ); } // equivalent to Iterator <E > it = collection . iterator (); while ( it . hasNext ()) { E element = it . next (); System . out . println ( element ); } Алексей Владыкин Collections 21 октября 2013 7 / 44
  • 9. Collections Framework Общие сведения Разновидности коллекций List — список (фиксированный порядок, доступ к элементам по индексу) Queue, Deque — очередь и дек (доступ к элементам с начала и с конца) Set — множество (каждый элемент встречается не более одного раза) Map — ассоциативный массив (набор пар «ключ–значение») Алексей Владыкин Collections 21 октября 2013 8 / 44
  • 10. Collections Framework Списки java.util.List Фиксированный порядок Доступ к элементам по индексу Операции: E get(int index) E set(int index, E element) void add(int index, E element) E remove(int index) int indexOf(Object o) int lastIndexOf(Object o) List<E> subList(int fromIndex, int toIndex) equals: списки равны, если содержат равные элементы в одинаковом порядке Алексей Владыкин Collections 21 октября 2013 9 / 44
  • 11. Collections Framework Списки java.util.ArrayList Реализация списка на основе массива Специфические операции: void ensureCapacity(int capacity) void trimToSize() Эффективный доступ к элементу по индексу Вставка/удаление по индексу имеет линейную трудоемкость List < String > words = new ArrayList < >(); words . add ( " one " ); words . set (0 , " two " ); words . add (0 , " three " ); words . remove (1); Алексей Владыкин Collections 21 октября 2013 10 / 44
  • 12. Collections Framework Списки java.util.LinkedList Реализация списка на основе двусвязного списка Эффективные вставка и удаление элемента в начале и в конце списка Доступ к элементу по индексу имеет линейную трудоемкость List < String > words = new LinkedList < >(); words . add ( " one " ); words . add ( " two " ); words . add ( " three " ); words . subList (1 , 3). clear (); Алексей Владыкин Collections 21 октября 2013 11 / 44
  • 13. Collections Framework Очереди java.util.Queue First In — First Out (FIFO) Операции: boolean offer(E e) E peek() E poll() Алексей Владыкин Collections 21 октября 2013 12 / 44
  • 14. Collections Framework Очереди java.util.PriorityQueue Реализация очереди с приоритетами на основе двоичной кучи offer и poll работают за O(log(N)) Извлекается элемент с минимальным значением PriorityQueue < Integer > pq = new PriorityQueue < >(); pq . offer (3); pq . offer (2); pq . offer (1); Integer element ; while (( element = pq . poll ()) != null ) { System . out . println ( element ); } Алексей Владыкин Collections 21 октября 2013 13 / 44
  • 15. Collections Framework Очереди java.util.Deque Стек и очередь в одном флаконе Операции: boolean offerFirst(E e) E peekFirst() E pollFirst() boolean offerLast(E e) E peekLast() E pollLast() Алексей Владыкин Collections 21 октября 2013 14 / 44
  • 16. Collections Framework Очереди java.util.ArrayDeque Реализация дека на основе массива Рекомендованный класс для обычной очереди и стека Deque < Integer > pq = new ArrayDeque < >(); pq . offerLast (3); pq . offerLast (2); pq . offerLast (1); Integer element ; while (( element = pq . pollFirst ()) != null ) { System . out . println ( element ); } Алексей Владыкин Collections 21 октября 2013 15 / 44
  • 17. Collections Framework Множества java.util.Set Каждый элемент встречается не более одного раза Не добавляет новых операций к тем, что есть в java.util.Collection Но гарантирует, что при добавлении элементов дубликаты не появятся equals: множества равны, если содержат одинаковые элементы Алексей Владыкин Collections 21 октября 2013 16 / 44
  • 18. Collections Framework Множества java.util.HashSet Реализация множества на основе хеш-таблицы Порядок обхода элементов непредсказуем Set < String > words = new HashSet < >(); words . add ( " one " ); words . add ( " one " ); words . add ( " two " ); words . add ( " two " ); Алексей Владыкин Collections 21 октября 2013 17 / 44
  • 19. Collections Framework Множества java.util.LinkedHashSet Реализация множества на основе хеш-таблицы Порядок обхода элементов определяется порядком вставки Set < String > words = new LinkedHashSet < >(); words . add ( " one " ); words . add ( " one " ); words . add ( " two " ); words . add ( " two " ); Алексей Владыкин Collections 21 октября 2013 18 / 44
  • 20. Collections Framework Множества Специфика хеш-таблиц Контракт equals() и hashCode(): если a.equals(b), то a.hashCode()==b.hashCode() Пока объект находится в хеш-таблице, нельзя менять его поля, влияющие на значение hashCode() Алексей Владыкин Collections 21 октября 2013 19 / 44
  • 21. Collections Framework Множества java.util.TreeSet Реализация множества на основе дерева поиска Элементы хранятся отсортированными SortedSet < String > words = new TreeSet < >(); words . add ( " aaa " ); words . add ( " bbb " ); words . add ( " ccc " ); words . headSet ( " bbb " ). clear (); Алексей Владыкин Collections 21 октября 2013 20 / 44
  • 22. Collections Framework Множества Специфика деревьев поиска Порядок элементов определяется: объектом типа java.util.Comparator с методом int compare(T o1, T o2) методом элементов int compareTo(T o) (элементы должны реализовать интерфейс java.lang.Comparable) Пока объект находится в дереве, нельзя менять его поля, влияющие на вычисление compareTo(T) Контракт equals() и compareTo(): a.equals(b) == (a.compareTo(b) == 0) Алексей Владыкин Collections 21 октября 2013 21 / 44
  • 23. Collections Framework Множества Удаление дубликатов из коллекции List < String > list = new ArrayList < >(); list . add ( " aaa " ); list . add ( " aaa " ); list . add ( " bbb " ); list . add ( " aaa " ); Set < String > set = new LinkedHashSet < >( list ); List < String > listWithoutDups = new ArrayList < >( set ); Алексей Владыкин Collections 21 октября 2013 22 / 44
  • 24. Collections Framework Ассоциативные массивы java.util.Map Набор пар «ключ–значение» Не наследует java.util.Collection Основные операции: int size() boolean isEmpty() V get(Object key) V put(K key, V value) V remove(Object key) boolean containsKey(Object key) boolean containsValue(Object value) Set<K> keySet() Collection<V> values() Set<Map.Entry<K, V>> entrySet() equals: равны, если содержат одинаковые пары «ключ-значение» Алексей Владыкин Collections 21 октября 2013 23 / 44
  • 25. Collections Framework Ассоциативные массивы java.util.HashMap Реализация ассоциативного массива на основе хеш-таблицы Порядок обхода элементов непредсказуем Есть java.util.LinkedHashMap Map < String , String > dictionary = new HashMap < >(); dictionary . put ( " foo " , " bar " ); dictionary . put ( " bar " , " baz " ); dictionary . remove ( " bar " ); Алексей Владыкин Collections 21 октября 2013 24 / 44
  • 26. Collections Framework Ассоциативные массивы java.util.TreeMap Реализация ассоциативного массива на основе дерева поиска Элементы хранятся отсортированными по ключу SortedMap < String , String > dictionary = new TreeMap < >(); dictionary . put ( " foo " , " bar " ); dictionary . put ( " bar " , " baz " ); dictionary . subMap ( " bar " , " foo " ). clear (); Алексей Владыкин Collections 21 октября 2013 25 / 44
  • 27. Collections Framework Ассоциативные массивы Обход ассоциативного массива Map <A , B > map = new HashMap < >(); for ( A key : map . keySet ()) { ... } for ( B value : map . values ()) { ... } for ( Map . Entry <A , B > entry : map . entrySet ()) { entry . getKey (); entry . getValue (); } Алексей Владыкин Collections 21 октября 2013 26 / 44
  • 28. Collections Framework Ассоциативные массивы Устаревшие классы java.util.Vector java.util.Stack java.util.Dictionary java.util.Hashtable Алексей Владыкин Collections 21 октября 2013 27 / 44
  • 29. Collections Framework Рецепты Сборник рецептов Алексей Владыкин Collections 21 октября 2013 28 / 44
  • 30. Collections Framework Рецепты Как отсортировать список // move elements randomly Collections . shuffle ( list ); // list is sorted in - place Collections . sort ( list ); Алексей Владыкин Collections 21 октября 2013 29 / 44
  • 31. Collections Framework Рецепты Как запретить изменение Set < String > set = Collections . unmodifiableSet ( originalSet ); set . remove ( " abc " ); // throws Unsu p p o r t e d O p e r a t i o nE x c e p t i o n Алексей Владыкин Collections 21 октября 2013 30 / 44
  • 32. Collections Framework Рецепты Как перелить коллекцию в массив // List < Integer > list Integer [] array = list . toArray ( new Integer [ list . size ()]); Алексей Владыкин Collections 21 октября 2013 31 / 44
  • 33. Collections Framework Рецепты Как перелить массив в коллекцию String [] array = { " A " , " B " , " C " }; Set < String > set1 = new HashSet < >( Arrays . asList ( array )); Set < String > set2 = new HashSet < >(); Collections . addAll ( set2 , array ); Алексей Владыкин Collections 21 октября 2013 32 / 44
  • 34. Collections Framework Алексей Владыкин Java 8 Collections 21 октября 2013 33 / 44
  • 35. Collections Framework Java 8 Было List < Block > blocks = /* ... */ ; int sumOfWeights = 0; for ( Block block : blocks ) { if ( block . getColor () == Color . RED ) { sumOfWeights += block . getWeight (); } } Алексей Владыкин Collections 21 октября 2013 34 / 44
  • 36. Collections Framework Java 8 Стало List < Block > blocks = /* ... */ ; int sumOfWeights = blocks . stream () . filter ( b -> b . getColor () == Color . RED ) . map ( b -> b . getWeight ()) . sum (); Алексей Владыкин Collections 21 октября 2013 35 / 44
  • 37. Generics Алексей Владыкин Collections 21 октября 2013 36 / 44
  • 38. Generics Возможность параметризовать класс или метод другим классом Появилась в Java 5 Напоминает шаблоны в C++, но есть большие отличия Нельзя использовать в качестве параметра примитивные типы или значения примитивных типов Алексей Владыкин Collections 21 октября 2013 37 / 44
  • 39. Generics Параметризованный класс package java . lang . ref ; public abstract class Reference <T > { private T referent ; public T get () { return referent ; } /* the rest was skipped */ } Алексей Владыкин Collections 21 октября 2013 38 / 44
  • 40. Generics Параметризованный метод package java . util ; public class Collections { public static <T > List <T > nCopies ( int n , T o ) // implementation skipped } Алексей Владыкин Collections 21 октября 2013 39 / 44
  • 41. Generics Ограничения По имени параметра нельзя создать экземпляр или массив T obj = new T (); // compilation error T [] arr = new T []; // compilation error Во время исполнения информация о generic-параметрах недоступна if ( list instanceof List <T >) // compilation error Алексей Владыкин Collections 21 октября 2013 40 / 44
  • 42. Generics Поддержка наследования Если class Child extends Parent, то: Parent parent = new Child (); // OK Parent [] parentArray = new Child []; // OK List < Parent > list = new ArrayList < Child >(); // not OK ! List <? extends Parent > list2 = new ArrayList < Child >(); Алексей Владыкин Collections // OK 21 октября 2013 41 / 44
  • 43. Generics package java . util ; public class Collections { public static <T > void copy ( List <? super T > dest , List <? extends T > src ) // implementation skipped } Алексей Владыкин Collections 21 октября 2013 42 / 44
  • 44. Generics Autoboxing Автоматическая упаковка примитивных типов в обертки и распаковка обратно List < Integer > list = new ArrayList < >(); for ( int i = 0; i < 10; ++ i ) { list . add ( i ); } for ( int i = 0; i < 10; ++ i ) { list . remove ( i ); // ooops } Алексей Владыкин Collections 21 октября 2013 43 / 44
  • 45. Что сегодня узнали Можно хранить наборы объектов не только в массивах, но и в более гибких и функциональных коллекциях В стандартной библиотеке Java есть списки, множества и ассоциативные массивы Работа с коллекциями стала намного удобнее с появлением Generic’ов в Java 5 Алексей Владыкин Collections 21 октября 2013 44 / 44