Стандартная библиотека java: collections framework · Стандартная...

45
Стандартная библиотека Java: Collections Framework Алексей Владыкин 21 октября 2013 Алексей Владыкин Collections 21 октября 2013 1 / 44

Upload: others

Post on 16-Jun-2020

27 views

Category:

Documents


0 download

TRANSCRIPT

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

Стандартная библиотека Java:Collections Framework

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

21 октября 2013

Алексей Владыкин Collections 21 октября 2013 1 / 44

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

1 Collections Framework

2 Generics

Алексей Владыкин Collections 21 октября 2013 2 / 44

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

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

Алексей Владыкин Collections 21 октября 2013 3 / 44

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

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

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

Разнообразные контейнеры для хранения наборов объектов,более удобные, чем массивы

добавление/удаление элементовзапрет модификации коллекцииоперации поиска, объединения, вычитанияиндексация элементов произвольными объектами

В отличие от массивов, могут хранить только объекты.Для примитивных типов — классы-обертки и autoboxing

Пакет java.util

Алексей Владыкин Collections 21 октября 2013 4 / 44

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

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

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

Разнообразные контейнеры для хранения наборов объектов,более удобные, чем массивы

добавление/удаление элементовзапрет модификации коллекцииоперации поиска, объединения, вычитанияиндексация элементов произвольными объектами

В отличие от массивов, могут хранить только объекты.Для примитивных типов — классы-обертки и autoboxing

Пакет java.util

Алексей Владыкин Collections 21 октября 2013 4 / 44

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

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

java.util.Collection

Базовый интерфейс для коллекций

Основные операции:int size()boolean isEmpty()boolean contains(Object o) — использует equalsboolean add(E e)boolean remove(Object o)void clear()

Алексей Владыкин Collections 21 октября 2013 5 / 44

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

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

java.util.Iterator

Единообразный способ обхода элементов коллекции

Операции:boolean hasNext()E next()void remove()

Алексей Владыкин Collections 21 октября 2013 6 / 44

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

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

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

// foreach syntaxfor (E element : collection) {

System.out.println(element );}

// equivalent toIterator <E> it = collection.iterator ();while (it.hasNext ()) {

E element = it.next ();System.out.println(element );

}

Алексей Владыкин Collections 21 октября 2013 7 / 44

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

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

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

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

Queue, Deque — очередь и дек(доступ к элементам с начала и с конца)

Set — множество(каждый элемент встречается не более одного раза)

Map — ассоциативный массив(набор пар «ключ–значение»)

Алексей Владыкин Collections 21 октября 2013 8 / 44

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

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

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

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

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

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

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

Collections Framework Очереди

java.util.Queue

First In — First Out (FIFO)

Операции:boolean offer(E e)E peek()E poll()

Алексей Владыкин Collections 21 октября 2013 12 / 44

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

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

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

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

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

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

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

Collections Framework Множества

java.util.Set

Каждый элемент встречается не более одного раза

Не добавляет новых операций к тем, что естьв java.util.Collection

Но гарантирует, что при добавлении элементов дубликатыне появятся

equals: множества равны, если содержат одинаковые элементы

Алексей Владыкин Collections 21 октября 2013 16 / 44

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

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

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

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

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

Collections Framework Множества

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

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

Пока объект находится в хеш-таблице, нельзя менять его поля,влияющие на значение hashCode()

Алексей Владыкин Collections 21 октября 2013 19 / 44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

java.util.Vector

java.util.Stack

java.util.Dictionary

java.util.Hashtable

Алексей Владыкин Collections 21 октября 2013 27 / 44

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

Collections Framework Рецепты

Сборник рецептов

Алексей Владыкин Collections 21 октября 2013 28 / 44

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

Collections Framework Рецепты

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

// move elements randomlyCollections.shuffle(list);

// list is sorted in -placeCollections.sort(list);

Алексей Владыкин Collections 21 октября 2013 29 / 44

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

Collections Framework Рецепты

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

Set <String > set =Collections.unmodifiableSet(originalSet );

set.remove("abc");// throws UnsupportedOperationException

Алексей Владыкин Collections 21 октября 2013 30 / 44

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

Collections Framework Рецепты

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

// List <Integer > list

Integer [] array =list.toArray(new Integer[list.size ()]);

Алексей Владыкин Collections 21 октября 2013 31 / 44

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

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

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

Collections Framework Java 8

Алексей Владыкин Collections 21 октября 2013 33 / 44

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

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

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

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

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

Generics

Алексей Владыкин Collections 21 октября 2013 36 / 44

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

Generics

Возможность параметризовать класс или метод другим классом

Появилась в Java 5

Напоминает шаблоны в C++, но есть большие отличия

Нельзя использовать в качестве параметра примитивные типыили значения примитивных типов

Алексей Владыкин Collections 21 октября 2013 37 / 44

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

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

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

Generics

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

package java.util;

public class Collections {

public static <T> List <T> nCopies(int n, T o)// implementation skipped

}

Алексей Владыкин Collections 21 октября 2013 39 / 44

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

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

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

Generics

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

Если class Child extends Parent, то:

Parent parent = new Child (); // OKParent [] parentArray = new Child []; // OK

List <Parent > list =new ArrayList <Child >(); // not OK!

List <? extends Parent > list2 =new ArrayList <Child >(); // OK

Алексей Владыкин Collections 21 октября 2013 41 / 44

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

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

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

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

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

Что сегодня узнали

Можно хранить наборы объектов не только в массивах, но и вболее гибких и функциональных коллекциях

В стандартной библиотеке Java есть списки, множества иассоциативные массивы

Работа с коллекциями стала намного удобнее с появлениемGeneric’ов в Java 5

Алексей Владыкин Collections 21 октября 2013 44 / 44