Your SlideShare is downloading. ×
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
2013 10 21_java_lecture_07
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

2013 10 21_java_lecture_07

1,664

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,664
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
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

×