SlideShare une entreprise Scribd logo
1  sur  45
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
MERA_school
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
MERA_school
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
MERA_school
 

Tendances (13)

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

Similaire à 05 - Java. Collections Framework и Generics

Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
Dmitry Tsitelov
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
 

Similaire à 05 - Java. Collections Framework и Generics (20)

Lec 3
Lec 3Lec 3
Lec 3
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Java Core. Lecture# 4. Collections.
Java Core. Lecture# 4. Collections.Java Core. Lecture# 4. Collections.
Java Core. Lecture# 4. Collections.
 
Scala for android
Scala for androidScala for android
Scala for android
 
Kotlin
KotlinKotlin
Kotlin
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Bytecode
BytecodeBytecode
Bytecode
 
Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»
 
C# Desktop. Занятие 05.
C# Desktop. Занятие 05.C# Desktop. Занятие 05.
C# Desktop. Занятие 05.
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its Underscore
 

Plus de Roman Brovko

Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 

Plus de Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
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