SlideShare a Scribd company logo
Collections Framework и Generics
Алексей Владыкин
6 октября 2014
Алексей Владыкин Collections 6 октября 2014 1 / 45
1 Generics
2 Collections Framework
Алексей Владыкин Collections 6 октября 2014 2 / 45
Generics
Алексей Владыкин Collections 6 октября 2014 3 / 45
Generics
Возможность параметризовать класс или метод каким-либо
типом
Напоминает шаблоны в C++, но есть большие отличия
(нельзя использовать примитивные типы и их значения)
Поддержка добавлена в Java 5
Алексей Владыкин Collections 6 октября 2014 4 / 45
Generics
Параметризованный класс
package java.lang.ref;
public abstract class Reference <T> {
private T referent;
Reference(T referent) {
this.referent = referent;
}
public T get() {
return referent;
}
}
Алексей Владыкин Collections 6 октября 2014 5 / 45
Generics
WeakReference <Integer > ref = new WeakReference < >(1000);
System.out.printf("Initial value: %sn", ref.get ());
int gcCount = 0;
do {
System.gc();
gcCount ++;
System.out.printf(
"Value after GC #%d: %sn",
gcCount , ref.get ());
} while (ref.get() != null );
Алексей Владыкин Collections 6 октября 2014 6 / 45
Generics
Параметризованный метод
package java.util;
public class Collections {
public static <T> List <T> nCopies(int n, T o){
// ...
}
}
Алексей Владыкин Collections 6 октября 2014 7 / 45
Generics
Реализация
Реализация generic’ов в Java основана на «type erasure»
Для generic класса или метода генерируется только один вариант,
вне зависимости от количества разных параметризаций
На этапе компиляции выполняются проверки типов и
добавляются необходимые приведения типов
Алексей Владыкин Collections 6 октября 2014 8 / 45
Generics
Что генерирует компилятор
package java.lang.ref;
public abstract class Reference {
private Object referent;
Reference(Object referent) {
this.referent = referent;
}
public Object get() {
return referent;
}
}
Алексей Владыкин Collections 6 октября 2014 9 / 45
Generics
WeakReference ref = new WeakReference (1000);
System.out.printf("Initial value: %sn",
(Integer) ref.get ());
int gcCount = 0;
do {
System.gc();
gcCount ++;
System.out.printf(
"Value after GC #%d: %sn",
gcCount , (Integer) ref.get ());
} while (( Integer) ref.get() != null );
Алексей Владыкин Collections 6 октября 2014 10 / 45
Generics
Ограничения
По имени параметра нельзя создать экземпляр или массив
T obj = new T(); // compilation error
T[] arr = new T[0]; // compilation error
Во время исполнения информация о generic-параметрах
недоступна
if (obj instanceof T) // compilation error
Алексей Владыкин Collections 6 октября 2014 11 / 45
Generics
Поддержка наследования
Если class Integer extends Number, то:
Number number = new Integer (1); // OK
Number [] numberArray = new Integer [0]; // OK
Reference <Number > ref =
new WeakReference <Integer >(1); // not OK!
Reference <? extends Number > ref2 =
new WeakReference <Integer >(1); // OK
Алексей Владыкин Collections 6 октября 2014 12 / 45
Generics
package java.util;
public class Collections {
public static <T> void copy(
List <? super T> dest ,
List <? extends T> src) {
// ...
}
}
Алексей Владыкин Collections 6 октября 2014 13 / 45
Collections Framework Общие сведения
Алексей Владыкин Collections 6 октября 2014 14 / 45
Collections Framework Общие сведения
Что такое коллекции
Разнообразные контейнеры для хранения наборов объектов,
более удобные, чем массивы
добавление/удаление элементов
read-only коллекции
операции поиска, объединения, вычитания
поддержка разнообразных специальных случаев
В отличие от массивов, могут хранить только объекты.
Для примитивных типов — классы-обертки и autoboxing
Пакет java.util
Алексей Владыкин Collections 6 октября 2014 15 / 45
Collections Framework Общие сведения
java.util.Collection
Базовый интерфейс для коллекций
Основные операции:
int size()
boolean isEmpty()
boolean contains(Object o)
boolean add(E e)
boolean remove(Object o)
void clear()
Object.equals()
Алексей Владыкин Collections 6 октября 2014 16 / 45
Collections Framework Общие сведения
java.util.Iterator
Единообразный способ обхода элементов коллекции
Операции:
boolean hasNext()
E next()
void remove()
Алексей Владыкин Collections 6 октября 2014 17 / 45
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 6 октября 2014 18 / 45
Collections Framework Общие сведения
Разновидности коллекций
List — список
(фиксированный порядок, доступ к элементам по индексу)
Queue, Deque — очередь и дек
(доступ к элементам с начала и с конца)
Set — множество
(каждый элемент встречается не более одного раза)
Map — ассоциативный массив
(набор пар «ключ–значение»)
Алексей Владыкин Collections 6 октября 2014 19 / 45
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 6 октября 2014 20 / 45
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 6 октября 2014 21 / 45
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 6 октября 2014 22 / 45
Collections Framework Очереди
java.util.Queue
First In — First Out (FIFO)
Операции:
boolean offer(E e)
E peek()
E poll()
Алексей Владыкин Collections 6 октября 2014 23 / 45
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 6 октября 2014 24 / 45
Collections Framework Очереди
java.util.Deque
Стек и очередь в одном флаконе
Операции:
boolean offerFirst(E e)
E peekFirst()
E pollFirst()
boolean offerLast(E e)
E peekLast()
E pollLast()
Алексей Владыкин Collections 6 октября 2014 25 / 45
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 6 октября 2014 26 / 45
Collections Framework Множества
java.util.Set
Каждый элемент встречается не более одного раза
Не добавляет новых операций к тем, что есть
в java.util.Collection
Но гарантирует, что при добавлении элементов дубликаты
не появятся
equals: множества равны, если содержат одинаковые элементы
Алексей Владыкин Collections 6 октября 2014 27 / 45
Collections Framework Множества
java.util.HashSet
Реализация множества на основе хеш-таблицы
Порядок обхода элементов непредсказуем
Set <String > words = new HashSet <>();
words.add("one");
words.add("one");
words.add("two");
words.add("two");
Алексей Владыкин Collections 6 октября 2014 28 / 45
Collections Framework Множества
java.util.LinkedHashSet
Реализация множества на основе хеш-таблицы
Порядок обхода элементов определяется порядком вставки
Set <String > words = new LinkedHashSet <>();
words.add("one");
words.add("one");
words.add("two");
words.add("two");
Алексей Владыкин Collections 6 октября 2014 29 / 45
Collections Framework Множества
Специфика хеш-таблиц
Контракт equals() и hashCode():
если a.equals(b), то a.hashCode()==b.hashCode()
Пока объект находится в хеш-таблице, нельзя менять его поля,
влияющие на значение hashCode()
Алексей Владыкин Collections 6 октября 2014 30 / 45
Collections Framework Множества
java.util.TreeSet
Реализация множества на основе дерева поиска
Элементы хранятся отсортированными
SortedSet <String > words = new TreeSet <>();
words.add("aaa");
words.add("bbb");
words.add("ccc");
words.headSet("bbb"). clear ();
Алексей Владыкин Collections 6 октября 2014 31 / 45
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 6 октября 2014 32 / 45
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 6 октября 2014 33 / 45
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 6 октября 2014 34 / 45
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 6 октября 2014 35 / 45
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 6 октября 2014 36 / 45
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 6 октября 2014 37 / 45
Collections Framework Ассоциативные массивы
Устаревшие классы
java.util.Vector
java.util.Stack
java.util.Dictionary
java.util.Hashtable
Алексей Владыкин Collections 6 октября 2014 38 / 45
Collections Framework Рецепты
Сборник рецептов
Алексей Владыкин Collections 6 октября 2014 39 / 45
Collections Framework Рецепты
Как отсортировать список
// move elements randomly
Collections.shuffle(list );
// list is sorted in -place
Collections.sort(list );
Алексей Владыкин Collections 6 октября 2014 40 / 45
Collections Framework Рецепты
Как запретить изменение
Set <String > set =
Collections.unmodifiableSet(originalSet );
set.remove("abc");
// throws UnsupportedOperationException
Алексей Владыкин Collections 6 октября 2014 41 / 45
Collections Framework Рецепты
Как перелить коллекцию в массив
// List <Integer > list
Integer [] array =
list.toArray(new Integer[list.size ()]);
Алексей Владыкин Collections 6 октября 2014 42 / 45
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 6 октября 2014 43 / 45
Collections Framework Рецепты
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 6 октября 2014 44 / 45
Что сегодня узнали
Можно хранить наборы объектов не только в массивах, но и в
более гибких и функциональных коллекциях
В стандартной библиотеке Java есть списки, множества и
ассоциативные массивы
Работа с коллекциями стала намного удобнее с появлением
Generic’ов в Java 5
Алексей Владыкин Collections 6 октября 2014 45 / 45

More Related Content

PDF
07 - Java. Элементы функционального программирования в Java
PDF
11 - Java. Многопоточность в Java: средства стандартной библиотеки
PDF
12 - Java. Разработка сетевых приложений на Java
PDF
10 - Java. Многопоточность в Java: основы
PDF
06 - Java. Ввод/вывод, доступ к файловой системе
PDF
08 - Java. Java-классы: взгляд изнутри
PDF
01 - Java. Введение в Java
PDF
03 - Java. Объекты, классы и пакеты в Java
07 - Java. Элементы функционального программирования в Java
11 - Java. Многопоточность в Java: средства стандартной библиотеки
12 - Java. Разработка сетевых приложений на Java
10 - Java. Многопоточность в Java: основы
06 - Java. Ввод/вывод, доступ к файловой системе
08 - Java. Java-классы: взгляд изнутри
01 - Java. Введение в Java
03 - Java. Объекты, классы и пакеты в Java

What's hot (13)

PPT
Oop java.generics
PDF
C++ STL & Qt. Занятие 01.
PPT
10. java lecture generics&collections
PPT
8. java lecture threads
PDF
Lambdas in java 8
PDF
C++ STL & Qt. Занятие 02.
PDF
Java осень 2014 занятие 3
PPT
9. java lecture library
PDF
Java осень 2014 занятие 5
PPT
3. java lecture classes
PDF
C++ STL & Qt. Занятие 04.
PDF
C++ STL & Qt. Занятие 05.
PPT
Java. Сборщик мусора. Работа с памятью.
Oop java.generics
C++ STL & Qt. Занятие 01.
10. java lecture generics&collections
8. java lecture threads
Lambdas in java 8
C++ STL & Qt. Занятие 02.
Java осень 2014 занятие 3
9. java lecture library
Java осень 2014 занятие 5
3. java lecture classes
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 05.
Java. Сборщик мусора. Работа с памятью.
Ad

Similar to 05 - Java. Collections Framework и Generics (20)

PPTX
Collections
PPTX
Java Core. Lecture# 4. Collections.
PDF
C# Desktop. Занятие 05.
PDF
PDF
PPT
Java. Введение в коллекции. Классы обертки. Перечисленияю
PDF
Tricky Java Generics
PPT
Java. Интерфейс Set - наборы (множества) и его реализации.
PDF
Java осень 2014 занятие 2
PPT
Msu.Center.Lectures.J04 Std Libs
PPT
04 Стандартная Библиотека
PDF
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
PDF
AlgoCollections (RUS)
PPTX
Binary Studio Academy 2016. Data structures and LINQ
PPT
Java Generics: What it is and How to Implement it
PPT
Лекция 6
PPT
PDF
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
PDF
Scala: что, как и зачем?
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
Collections
Java Core. Lecture# 4. Collections.
C# Desktop. Занятие 05.
Java. Введение в коллекции. Классы обертки. Перечисленияю
Tricky Java Generics
Java. Интерфейс Set - наборы (множества) и его реализации.
Java осень 2014 занятие 2
Msu.Center.Lectures.J04 Std Libs
04 Стандартная Библиотека
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
AlgoCollections (RUS)
Binary Studio Academy 2016. Data structures and LINQ
Java Generics: What it is and How to Implement it
Лекция 6
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Scala: что, как и зачем?
Объектно-ориентированное программирование. Лекции 9 и 10
Ad

More from Roman Brovko (20)

PDF
Individual task Networking
PPTX
Networking essentials lect3
PPTX
Gl embedded starterkit_ethernet
PPTX
Networking essentials lect2
PPTX
Networking essentials lect1
PPTX
Bare metal training_07_spi_flash
PPTX
Bare metal training_06_I2C
PPTX
Glesk worshop
PPTX
Bare metal training_05_uart
PPTX
Bare metal training_04_adc_temp_sensor
PPTX
Bare metal training_03_timers_pwm
PPTX
Bare metal training_02_le_ds_and_buttons
PPTX
Bare metal training_01_hello_world
PPTX
Bare metal training_00_prerequisites
PPTX
C language lect_23_advanced
PPTX
C language lect_22_advanced
PPTX
C language lect_21_advanced
PPTX
подготовка рабочего окружения
PPTX
C language lect_20_advanced
PPTX
C language lect_19_basics
Individual task Networking
Networking essentials lect3
Gl embedded starterkit_ethernet
Networking essentials lect2
Networking essentials lect1
Bare metal training_07_spi_flash
Bare metal training_06_I2C
Glesk worshop
Bare metal training_05_uart
Bare metal training_04_adc_temp_sensor
Bare metal training_03_timers_pwm
Bare metal training_02_le_ds_and_buttons
Bare metal training_01_hello_world
Bare metal training_00_prerequisites
C language lect_23_advanced
C language lect_22_advanced
C language lect_21_advanced
подготовка рабочего окружения
C language lect_20_advanced
C language lect_19_basics

05 - Java. Collections Framework и Generics

  • 1. Collections Framework и Generics Алексей Владыкин 6 октября 2014 Алексей Владыкин Collections 6 октября 2014 1 / 45
  • 2. 1 Generics 2 Collections Framework Алексей Владыкин Collections 6 октября 2014 2 / 45
  • 4. Generics Возможность параметризовать класс или метод каким-либо типом Напоминает шаблоны в C++, но есть большие отличия (нельзя использовать примитивные типы и их значения) Поддержка добавлена в Java 5 Алексей Владыкин Collections 6 октября 2014 4 / 45
  • 5. Generics Параметризованный класс package java.lang.ref; public abstract class Reference <T> { private T referent; Reference(T referent) { this.referent = referent; } public T get() { return referent; } } Алексей Владыкин Collections 6 октября 2014 5 / 45
  • 6. Generics WeakReference <Integer > ref = new WeakReference < >(1000); System.out.printf("Initial value: %sn", ref.get ()); int gcCount = 0; do { System.gc(); gcCount ++; System.out.printf( "Value after GC #%d: %sn", gcCount , ref.get ()); } while (ref.get() != null ); Алексей Владыкин Collections 6 октября 2014 6 / 45
  • 7. Generics Параметризованный метод package java.util; public class Collections { public static <T> List <T> nCopies(int n, T o){ // ... } } Алексей Владыкин Collections 6 октября 2014 7 / 45
  • 8. Generics Реализация Реализация generic’ов в Java основана на «type erasure» Для generic класса или метода генерируется только один вариант, вне зависимости от количества разных параметризаций На этапе компиляции выполняются проверки типов и добавляются необходимые приведения типов Алексей Владыкин Collections 6 октября 2014 8 / 45
  • 9. Generics Что генерирует компилятор package java.lang.ref; public abstract class Reference { private Object referent; Reference(Object referent) { this.referent = referent; } public Object get() { return referent; } } Алексей Владыкин Collections 6 октября 2014 9 / 45
  • 10. Generics WeakReference ref = new WeakReference (1000); System.out.printf("Initial value: %sn", (Integer) ref.get ()); int gcCount = 0; do { System.gc(); gcCount ++; System.out.printf( "Value after GC #%d: %sn", gcCount , (Integer) ref.get ()); } while (( Integer) ref.get() != null ); Алексей Владыкин Collections 6 октября 2014 10 / 45
  • 11. Generics Ограничения По имени параметра нельзя создать экземпляр или массив T obj = new T(); // compilation error T[] arr = new T[0]; // compilation error Во время исполнения информация о generic-параметрах недоступна if (obj instanceof T) // compilation error Алексей Владыкин Collections 6 октября 2014 11 / 45
  • 12. Generics Поддержка наследования Если class Integer extends Number, то: Number number = new Integer (1); // OK Number [] numberArray = new Integer [0]; // OK Reference <Number > ref = new WeakReference <Integer >(1); // not OK! Reference <? extends Number > ref2 = new WeakReference <Integer >(1); // OK Алексей Владыкин Collections 6 октября 2014 12 / 45
  • 13. Generics package java.util; public class Collections { public static <T> void copy( List <? super T> dest , List <? extends T> src) { // ... } } Алексей Владыкин Collections 6 октября 2014 13 / 45
  • 14. Collections Framework Общие сведения Алексей Владыкин Collections 6 октября 2014 14 / 45
  • 15. Collections Framework Общие сведения Что такое коллекции Разнообразные контейнеры для хранения наборов объектов, более удобные, чем массивы добавление/удаление элементов read-only коллекции операции поиска, объединения, вычитания поддержка разнообразных специальных случаев В отличие от массивов, могут хранить только объекты. Для примитивных типов — классы-обертки и autoboxing Пакет java.util Алексей Владыкин Collections 6 октября 2014 15 / 45
  • 16. Collections Framework Общие сведения java.util.Collection Базовый интерфейс для коллекций Основные операции: int size() boolean isEmpty() boolean contains(Object o) boolean add(E e) boolean remove(Object o) void clear() Object.equals() Алексей Владыкин Collections 6 октября 2014 16 / 45
  • 17. Collections Framework Общие сведения java.util.Iterator Единообразный способ обхода элементов коллекции Операции: boolean hasNext() E next() void remove() Алексей Владыкин Collections 6 октября 2014 17 / 45
  • 18. 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 6 октября 2014 18 / 45
  • 19. Collections Framework Общие сведения Разновидности коллекций List — список (фиксированный порядок, доступ к элементам по индексу) Queue, Deque — очередь и дек (доступ к элементам с начала и с конца) Set — множество (каждый элемент встречается не более одного раза) Map — ассоциативный массив (набор пар «ключ–значение») Алексей Владыкин Collections 6 октября 2014 19 / 45
  • 20. 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 6 октября 2014 20 / 45
  • 21. 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 6 октября 2014 21 / 45
  • 22. 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 6 октября 2014 22 / 45
  • 23. Collections Framework Очереди java.util.Queue First In — First Out (FIFO) Операции: boolean offer(E e) E peek() E poll() Алексей Владыкин Collections 6 октября 2014 23 / 45
  • 24. 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 6 октября 2014 24 / 45
  • 25. Collections Framework Очереди java.util.Deque Стек и очередь в одном флаконе Операции: boolean offerFirst(E e) E peekFirst() E pollFirst() boolean offerLast(E e) E peekLast() E pollLast() Алексей Владыкин Collections 6 октября 2014 25 / 45
  • 26. 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 6 октября 2014 26 / 45
  • 27. Collections Framework Множества java.util.Set Каждый элемент встречается не более одного раза Не добавляет новых операций к тем, что есть в java.util.Collection Но гарантирует, что при добавлении элементов дубликаты не появятся equals: множества равны, если содержат одинаковые элементы Алексей Владыкин Collections 6 октября 2014 27 / 45
  • 28. Collections Framework Множества java.util.HashSet Реализация множества на основе хеш-таблицы Порядок обхода элементов непредсказуем Set <String > words = new HashSet <>(); words.add("one"); words.add("one"); words.add("two"); words.add("two"); Алексей Владыкин Collections 6 октября 2014 28 / 45
  • 29. Collections Framework Множества java.util.LinkedHashSet Реализация множества на основе хеш-таблицы Порядок обхода элементов определяется порядком вставки Set <String > words = new LinkedHashSet <>(); words.add("one"); words.add("one"); words.add("two"); words.add("two"); Алексей Владыкин Collections 6 октября 2014 29 / 45
  • 30. Collections Framework Множества Специфика хеш-таблиц Контракт equals() и hashCode(): если a.equals(b), то a.hashCode()==b.hashCode() Пока объект находится в хеш-таблице, нельзя менять его поля, влияющие на значение hashCode() Алексей Владыкин Collections 6 октября 2014 30 / 45
  • 31. Collections Framework Множества java.util.TreeSet Реализация множества на основе дерева поиска Элементы хранятся отсортированными SortedSet <String > words = new TreeSet <>(); words.add("aaa"); words.add("bbb"); words.add("ccc"); words.headSet("bbb"). clear (); Алексей Владыкин Collections 6 октября 2014 31 / 45
  • 32. 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 6 октября 2014 32 / 45
  • 33. 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 6 октября 2014 33 / 45
  • 34. 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 6 октября 2014 34 / 45
  • 35. 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 6 октября 2014 35 / 45
  • 36. 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 6 октября 2014 36 / 45
  • 37. 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 6 октября 2014 37 / 45
  • 38. Collections Framework Ассоциативные массивы Устаревшие классы java.util.Vector java.util.Stack java.util.Dictionary java.util.Hashtable Алексей Владыкин Collections 6 октября 2014 38 / 45
  • 39. Collections Framework Рецепты Сборник рецептов Алексей Владыкин Collections 6 октября 2014 39 / 45
  • 40. Collections Framework Рецепты Как отсортировать список // move elements randomly Collections.shuffle(list ); // list is sorted in -place Collections.sort(list ); Алексей Владыкин Collections 6 октября 2014 40 / 45
  • 41. Collections Framework Рецепты Как запретить изменение Set <String > set = Collections.unmodifiableSet(originalSet ); set.remove("abc"); // throws UnsupportedOperationException Алексей Владыкин Collections 6 октября 2014 41 / 45
  • 42. Collections Framework Рецепты Как перелить коллекцию в массив // List <Integer > list Integer [] array = list.toArray(new Integer[list.size ()]); Алексей Владыкин Collections 6 октября 2014 42 / 45
  • 43. 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 6 октября 2014 43 / 45
  • 44. Collections Framework Рецепты 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 6 октября 2014 44 / 45
  • 45. Что сегодня узнали Можно хранить наборы объектов не только в массивах, но и в более гибких и функциональных коллекциях В стандартной библиотеке Java есть списки, множества и ассоциативные массивы Работа с коллекциями стала намного удобнее с появлением Generic’ов в Java 5 Алексей Владыкин Collections 6 октября 2014 45 / 45