Стандартная библиотека Java:
Collections Framework
Алексей Владыкин

21 октября 2013

Алексей Владыкин

Collections

21 ок...
1

Collections Framework

2

Generics

Алексей Владыкин

Collections

21 октября 2013

2 / 44
Collections Framework

Алексей Владыкин

Общие сведения

Collections

21 октября 2013

3 / 44
Collections Framework

Общие сведения

Что такое коллекции

Разнообразные контейнеры для хранения наборов объектов,
более ...
Collections Framework

Общие сведения

Что такое коллекции

Разнообразные контейнеры для хранения наборов объектов,
более ...
Collections Framework

Общие сведения

java.util.Collection

Базовый интерфейс для коллекций
Основные операции:
int size()...
Collections Framework

Общие сведения

java.util.Iterator

Единообразный способ обхода элементов коллекции
Операции:
boole...
Collections Framework

Общие сведения

Использование итератора

// foreach syntax
for ( E element : collection ) {
System ...
Collections Framework

Общие сведения

Разновидности коллекций

List — список
(фиксированный порядок, доступ к элементам п...
Collections Framework

Списки

java.util.List
Фиксированный порядок
Доступ к элементам по индексу
Операции:
E get(int inde...
Collections Framework

Списки

java.util.ArrayList
Реализация списка на основе массива
Специфические операции:
void ensure...
Collections Framework

Списки

java.util.LinkedList
Реализация списка на основе двусвязного списка
Эффективные вставка и у...
Collections Framework

Очереди

java.util.Queue

First In — First Out (FIFO)
Операции:
boolean offer(E e)
E peek()
E poll(...
Collections Framework

Очереди

java.util.PriorityQueue
Реализация очереди с приоритетами на основе двоичной кучи
offer и ...
Collections Framework

Очереди

java.util.Deque

Стек и очередь в одном флаконе
Операции:
boolean offerFirst(E e)
E peekFi...
Collections Framework

Очереди

java.util.ArrayDeque
Реализация дека на основе массива
Рекомендованный класс для обычной о...
Collections Framework

Множества

java.util.Set

Каждый элемент встречается не более одного раза
Не добавляет новых операц...
Collections Framework

Множества

java.util.HashSet

Реализация множества на основе хеш-таблицы
Порядок обхода элементов н...
Collections Framework

Множества

java.util.LinkedHashSet

Реализация множества на основе хеш-таблицы
Порядок обхода элеме...
Collections Framework

Множества

Специфика хеш-таблиц

Контракт equals() и hashCode():
если a.equals(b), то a.hashCode()=...
Collections Framework

Множества

java.util.TreeSet

Реализация множества на основе дерева поиска
Элементы хранятся отсорт...
Collections Framework

Множества

Специфика деревьев поиска

Порядок элементов определяется:
объектом типа java.util.Compa...
Collections Framework

Множества

Удаление дубликатов из коллекции

List < String > list = new ArrayList < >();
list . add...
Collections Framework

Ассоциативные массивы

java.util.Map
Набор пар «ключ–значение»
Не наследует java.util.Collection
Ос...
Collections Framework

Ассоциативные массивы

java.util.HashMap

Реализация ассоциативного массива на основе хеш-таблицы
П...
Collections Framework

Ассоциативные массивы

java.util.TreeMap

Реализация ассоциативного массива на основе дерева поиска...
Collections Framework

Ассоциативные массивы

Обход ассоциативного массива

Map <A , B > map = new HashMap < >();
for ( A ...
Collections Framework

Ассоциативные массивы

Устаревшие классы

java.util.Vector
java.util.Stack
java.util.Dictionary
jav...
Collections Framework

Рецепты

Сборник рецептов
Алексей Владыкин

Collections

21 октября 2013

28 / 44
Collections Framework

Рецепты

Как отсортировать список

// move elements randomly
Collections . shuffle ( list );
// lis...
Collections Framework

Рецепты

Как запретить изменение

Set < String > set =
Collections . unmodifiableSet ( originalSet ...
Collections Framework

Рецепты

Как перелить коллекцию в массив

// List < Integer > list
Integer [] array =
list . toArra...
Collections Framework

Рецепты

Как перелить массив в коллекцию

String [] array = { " A " , " B " , " C " };
Set < String...
Collections Framework

Алексей Владыкин

Java 8

Collections

21 октября 2013

33 / 44
Collections Framework

Java 8

Было

List < Block > blocks = /* ... */ ;
int sumOfWeights = 0;
for ( Block block : blocks ...
Collections Framework

Java 8

Стало

List < Block > blocks = /* ... */ ;
int sumOfWeights = blocks . stream ()
. filter (...
Generics

Алексей Владыкин

Collections

21 октября 2013

36 / 44
Generics

Возможность параметризовать класс или метод другим классом
Появилась в Java 5
Напоминает шаблоны в C++, но есть ...
Generics

Параметризованный класс
package java . lang . ref ;
public abstract class Reference <T > {
private T referent ;
...
Generics

Параметризованный метод

package java . util ;
public class Collections {
public static <T > List <T > nCopies (...
Generics

Ограничения
По имени параметра нельзя создать экземпляр или массив
T obj = new T ();

// compilation error

T []...
Generics

Поддержка наследования

Если class Child extends Parent, то:
Parent parent = new Child ();
// OK
Parent [] paren...
Generics

package java . util ;
public class Collections {
public static <T > void copy (
List <? super T > dest ,
List <?...
Generics

Autoboxing

Автоматическая упаковка примитивных типов в обертки и
распаковка обратно

List < Integer > list = ne...
Что сегодня узнали

Можно хранить наборы объектов не только в массивах, но и в
более гибких и функциональных коллекциях
В ...
Upcoming SlideShare
Loading in...5
×

2013 10 21_java_lecture_07

1,686

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,686
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2013 10 21_java_lecture_07

  1. 1. Стандартная библиотека Java: Collections Framework Алексей Владыкин 21 октября 2013 Алексей Владыкин Collections 21 октября 2013 1 / 44
  2. 2. 1 Collections Framework 2 Generics Алексей Владыкин Collections 21 октября 2013 2 / 44
  3. 3. Collections Framework Алексей Владыкин Общие сведения Collections 21 октября 2013 3 / 44
  4. 4. Collections Framework Общие сведения Что такое коллекции Разнообразные контейнеры для хранения наборов объектов, более удобные, чем массивы Алексей Владыкин Collections 21 октября 2013 4 / 44
  5. 5. Collections Framework Общие сведения Что такое коллекции Разнообразные контейнеры для хранения наборов объектов, более удобные, чем массивы добавление/удаление элементов запрет модификации коллекции операции поиска, объединения, вычитания индексация элементов произвольными объектами В отличие от массивов, могут хранить только объекты. Для примитивных типов — классы-обертки и autoboxing Пакет java.util Алексей Владыкин Collections 21 октября 2013 4 / 44
  6. 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. 7. Collections Framework Общие сведения java.util.Iterator Единообразный способ обхода элементов коллекции Операции: boolean hasNext() E next() void remove() Алексей Владыкин Collections 21 октября 2013 6 / 44
  8. 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. 9. Collections Framework Общие сведения Разновидности коллекций List — список (фиксированный порядок, доступ к элементам по индексу) Queue, Deque — очередь и дек (доступ к элементам с начала и с конца) Set — множество (каждый элемент встречается не более одного раза) Map — ассоциативный массив (набор пар «ключ–значение») Алексей Владыкин Collections 21 октября 2013 8 / 44
  10. 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. 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. 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. 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. 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. 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. 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. 17. Collections Framework Множества java.util.Set Каждый элемент встречается не более одного раза Не добавляет новых операций к тем, что есть в java.util.Collection Но гарантирует, что при добавлении элементов дубликаты не появятся equals: множества равны, если содержат одинаковые элементы Алексей Владыкин Collections 21 октября 2013 16 / 44
  18. 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. 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. 20. Collections Framework Множества Специфика хеш-таблиц Контракт equals() и hashCode(): если a.equals(b), то a.hashCode()==b.hashCode() Пока объект находится в хеш-таблице, нельзя менять его поля, влияющие на значение hashCode() Алексей Владыкин Collections 21 октября 2013 19 / 44
  21. 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. 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. 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. 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. 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. 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. 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. 28. Collections Framework Ассоциативные массивы Устаревшие классы java.util.Vector java.util.Stack java.util.Dictionary java.util.Hashtable Алексей Владыкин Collections 21 октября 2013 27 / 44
  29. 29. Collections Framework Рецепты Сборник рецептов Алексей Владыкин Collections 21 октября 2013 28 / 44
  30. 30. Collections Framework Рецепты Как отсортировать список // move elements randomly Collections . shuffle ( list ); // list is sorted in - place Collections . sort ( list ); Алексей Владыкин Collections 21 октября 2013 29 / 44
  31. 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. 32. Collections Framework Рецепты Как перелить коллекцию в массив // List < Integer > list Integer [] array = list . toArray ( new Integer [ list . size ()]); Алексей Владыкин Collections 21 октября 2013 31 / 44
  33. 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. 34. Collections Framework Алексей Владыкин Java 8 Collections 21 октября 2013 33 / 44
  35. 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. 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. 37. Generics Алексей Владыкин Collections 21 октября 2013 36 / 44
  38. 38. Generics Возможность параметризовать класс или метод другим классом Появилась в Java 5 Напоминает шаблоны в C++, но есть большие отличия Нельзя использовать в качестве параметра примитивные типы или значения примитивных типов Алексей Владыкин Collections 21 октября 2013 37 / 44
  39. 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. 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. 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. 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. 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. 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. 45. Что сегодня узнали Можно хранить наборы объектов не только в массивах, но и в более гибких и функциональных коллекциях В стандартной библиотеке Java есть списки, множества и ассоциативные массивы Работа с коллекциями стала намного удобнее с появлением Generic’ов в Java 5 Алексей Владыкин Collections 21 октября 2013 44 / 44
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×