59
Язык программирования JAVA Лекция# 4 Структуры данных в Java Моисеенко Антон [email protected] СПГУАП Кафедра Информационно-Сетевых Технологий

Java Core. Lecture# 4. Collections

Embed Size (px)

Citation preview

Page 1: Java Core. Lecture# 4. Collections

Язык программирования

JAVA

Лекция# 4

Структуры данных в Java

Моисеенко Антон[email protected]

СПГУАПКафедра Информационно-Сетевых Технологий

Page 2: Java Core. Lecture# 4. Collections

Содержание курса

1. Коллекции

2. Множества

3. Списки

4. Очереди и деки

5. Отображения

6. Заключение

Page 3: Java Core. Lecture# 4. Collections

Коллекции

■ Коллекция ─ неупорядоченный

набор элементов

■ Интерфейс Collection

Page 4: Java Core. Lecture# 4. Collections

Коллекции в Java

■ «Платформы Java содержат набор готовых классов, реализующих механизмы работы со структурами данных

■ Такие классы называются коллекциями (collections)

■ Хотя обработка массивов происходит быстрее, в ряде случаев требуется использовать коллекции

Page 5: Java Core. Lecture# 4. Collections

Предпосылки использования

■ Необходимость динамического изменения размера структуры данных

■ Динамическое добавление или удаление элемента

■ Хранение разнотипных элементов (объектов)

■ Извлечение и манипуляция данными из БД

■ Хранение и работа со сложными структурами данных (деревьями, списками, стеками, хеш- таблицами и т.д.) и т.п.

Page 6: Java Core. Lecture# 4. Collections

Базовые интерфейсы и

классы

■ Интерфейс Collection предназначен для хранения однородных элементов. Его расширяют интерфейсы:

■ List – список ■ Set – множество ■ Queue – очередь

■ Интерфейс Map предназначен для создания коллекций, хранящих пары «ключ-значение». Его реализуют классы:

■ HashMap■ IdentityHashMap ■ TreeMap

Page 7: Java Core. Lecture# 4. Collections

Интерфейс Collection

Page 8: Java Core. Lecture# 4. Collections

Методы интерфейса

Collection

■ boolean add(Object o) – Добавляет элемент в коллекцию; возвращает true если элемент был добавлен, и false, если коллекция не позволяет сохранять дубликаты, а добавляемый элемент таковым является.

■ boolean addAll(Collection coll) – Добавляет все элементы в коллекцию; возвращает true если какой-либо элемент был добавлен.

■ void clear() – Удаляет из коллекции все элементы. При этом те элементы, на кот. имеются ссылки у других элементов, не удаляются из памяти.

■ boolean contains(Object o) – Возвращает true если коллекция содержит заданный элемент.

Page 9: Java Core. Lecture# 4. Collections

Методы интерфейса

Collection(продолжение)

▪ boolean containsAll(Collection<?> coll) – Возвращает true если коллекция содержит все элементы из coll.

▪ boolean equals(Object o) – Возвращает true если сравниваемые коллекции равны.

▪ int hashCode() – Возвращает значение хэш кода для данной коллекции. Для любого класса, для которого переопределен метод Object.equals() должен быть переопределен метод Object.hashCode()

▪ boolean isEmpty() – Возвращает true если коллекция не содержит элементов.

Page 10: Java Core. Lecture# 4. Collections

Методы интерфейса

Collection(продолжение)

■ Iterator iterator() – Возвращает ссылку на объект Iterator, который позволяет выполнить эффективное, последовательное прохождение по всем элементам коллекции.

■ boolean remove(Object o) – Удаляет из коллекции одиночный экземпляр элемента o; возвращает true, если коллекция содержит такой элемент.

■ boolean removeAll(Collection<?> coll) – Удаляет их коллекции все элементы, которые также находятся в коллекции coll; возвращает true если какой-либо элемент удален. Никакие элементы в результирующей коллекции не будут равны элементам коллекции coll. Параметр coll необязателен.

Page 11: Java Core. Lecture# 4. Collections

Методы интерфейса

Collection(продолжение)

■ boolean retainAll(Collection<?> coll) – Оставляет в коллекции только те из входящих в неё элементов, которые входят в коллекции coll; возвращает true, если исходная коллекция изменена.

■ int size() – Возвращает количество элементов в коллекции.

■ Object[] toArray() – Возвращает массив, содержащий все элементы данной коллекции.

Page 12: Java Core. Lecture# 4. Collections

Методы интерфейса

Collection(продолжение)

■ <T> T[] toArray(T[] a) – Возвращает массив, содержащий все элементы данной коллекции; тип возвращаемого массива таков, как тип заданного массива. Если коллекция вмещается в заданный массив, она возвращается в массиве. В противном случае размещается массив с типом времени выполнения для заданного массива и размером равным размеру коллекции.

■ String toString() – Возвращает строку со списком элементов коллекции в квадратных скобках, через запятую и пробел

Page 13: Java Core. Lecture# 4. Collections

Иерархия классов, реализующих

интерфейсы Collection

Page 14: Java Core. Lecture# 4. Collections

Иерархия классов и

интерфейсов Map

Page 15: Java Core. Lecture# 4. Collections

Специфика хранения

элементов

■ Коллекции могут хранить только ссылки на объекты.

■ Примитивные типы могут быть сохранены в коллекции и извлечены из неё за счёт автоматических операций упаковки и распаковки в классы-оболочки (Boxing и Unboxing, с Java SE 5)

■ Начиная с версии Java SE 5, коллекции стали типизированными и при их создании рекомендуется указывать тип объектов, кот. будут храниться в ней

ArrayList<String> arr = new ArrayList<String>();

Page 16: Java Core. Lecture# 4. Collections

Пример. Вывод коллекции на экран

public void dump(Collection c) {

for (Iterator i = c.iterator(); i.hasNext(); ) {

String word = (String) i.next();

System.out.print(word + ", ");

}

System.out.println();

}

Page 17: Java Core. Lecture# 4. Collections

Преобразование в массив

■ Object[] toArray() ─ создает новый массив

■ Object[] toArray(Object[] a) ─ использует переданный

массив

■ Пример использования

String[] i = (String[])c.toArray(new String[c.size()]);

Page 18: Java Core. Lecture# 4. Collections

Итераторы

■ Итератор ─ обход коллекции

■ Интерфейс Iterator

■ Метод Iterator Collection.iterator()

Page 19: Java Core. Lecture# 4. Collections

Методы итераторов

■ hasNext() ─ определение наличия следующего

элемента

■ next() ─ взятие следующего элемента

■ remove() ─ удаление элемента

■ Исключения

○ NoSuchElementException ─ бросается при

достижении конца коллекции

○ ConcurrentModificationException ─ бросается при

изменении коллекции

Page 20: Java Core. Lecture# 4. Collections

Применение итераторов

■ Обход коллекцииfor(Iterator i = c.iterator(); i.hasNext(); ) {

Object element = i.next();

...

}

■ Фильтрование коллекцииfor(Iterator i = c.iterator(); i.hasNext(); ) {

if (!((String)i.next()).equals(“Bla-bla”)) i.remove();

}

Page 21: Java Core. Lecture# 4. Collections

Пример работы с итераторами

List compon = Arrays.asList(this.getComponents());

for (Iterator iter=compon.iterator(); iter.hasNext(); ) { Object elem = (Object) iter.next(); System.out.println(“Компонент: ”, elem.toString();

}

Page 22: Java Core. Lecture# 4. Collections

Множества

■ Множество ─ коллекция без

повторяющихся элементов

■ Интерфейс Set

Page 23: Java Core. Lecture# 4. Collections

Интерфейс Set

Page 24: Java Core. Lecture# 4. Collections

Сравнение элементов

■ Метод Object.equals(Object object)

■ Рефлексивность

o1.equals(o1)

■ Симметричность

o1.equals(o2) == e2.equals(o1)

■ Транзитивность

o1.equals(o2) && o2.equals(o3) => o1.equals(o3)

■ Устойчивость

o1.equals(o2) не изменяется, если o1 и o2 не

изменяются

■ Обработка null

o1.equals(null) == false

Page 25: Java Core. Lecture# 4. Collections

Операции над множествами

■ addAll(Collection c) – объединение

множеств

■ retainAll(Collection c) – пересечение

множеств

■ containsAll(Collection c) – проверка

вхождения

■ removeAll(Collection c) – разность

множеств

Page 26: Java Core. Lecture# 4. Collections

Классы, реализующие Set

■ HashSet ─ множество на основе хэша

■ LinkedHashSet ─ множество на основе

хэша c сохранение порядка обхода

■ TreeSet - коллекция, которая хранит

свои элементы в виде упорядоченного

по значениям дерева.

Page 27: Java Core. Lecture# 4. Collections

Конструкторы HashSet

■ HashSet() ─ пустое множество

■ HashSet(Collection c) ─ элементы

коллекции

■ HashSet(int initialCapacity) ─

начальная вместимость

■ HashSet(int initialCapacity, double

loadFactor) ─ начальная

вместимость и степень заполнения

Page 28: Java Core. Lecture# 4. Collections

Вычисление хэшей

■ Метод Object.hashCode()

■ Устойчивость hashCode() не

изменяется, если объект не

изменяется

■ Согласованность с equals

o1.equals(o2) => o1.hashCode() ==

o2.hashCode()

Page 29: Java Core. Lecture# 4. Collections

Списки

■ Представляет собой неупорядоченную коллекцию, в которой

допустимы дублирующие значения

■ Классы, реализующие List:

■ LinkedList – связанный список, можно вставлять элементы

только в начало и конец

■ ArrayList – динамический массив с произвольной вставкой и

удалением элементов

■ Элементы, находящиеся в коллекции List проиндексированы

Page 30: Java Core. Lecture# 4. Collections

Списки

Page 31: Java Core. Lecture# 4. Collections

Методы интерфейса List

■ <T>Elem get(int i) – Возвращает ссылку на элемент

списка под номером i

■ int indexOf(<T> obj) – Возвращает индекс (номер)

элемента obj. Если объект не найден, возвращает -

1.

■ ListIterator listIterator([int i]) – Возвращает итератор

списка с дополнительными возможностями (по

сравнению с Iterator). Если указан параметр i, то

итератор будет позиционирован на элемент с

индексом i

Page 32: Java Core. Lecture# 4. Collections

Методы интерфейса List

■ boolean remove(int i) – удаляет из списка элемент с

номером i.

■ set(int i, <T> obj) – заменяет элемент с номером i на

указанный элемент obj

■ List subList(i1, i2) – возвращает ссылку на

подсписок, содержащий элементы исходного списка

с номерами от i1 до i2

Page 33: Java Core. Lecture# 4. Collections

Методы класса Collections

■ Collections.addAll(c,e1,e2,…,en) – добавляет в

коллекцию c произвольное число элементов e1, …,

en

■ frequency(c, obj) – возвращает число вхождений

элемента obj в коллекцию с

■ reverse(list) – обращает порядок следования

элементов в списке list

■ sort(list) – сортирует список в порядке возрастания

элементов. Сравнение идёт с помощью вызова

метода e1.compareTo(e2) для элементов списка e1,

e2

Page 34: Java Core. Lecture# 4. Collections

Итератор по списку

■ Интерфейс ListIterator extends Iterator

■ Метод listIterator()

■ Предыдущий / Следующий элементы

Page 35: Java Core. Lecture# 4. Collections

Операции итератора по списку

■ Передвижение

○ hasNext() / hasPrevious() ─ проверка

○ next() / previous() ─ взятие элемента

○ nextIndex() / previousIndex() ─

определение индекса

■ Изменение

○ remove() ─ удаление элемента

○ set(Object e) ─ изменение элемента

○ add(Object e) ─ добавление элемента

Page 36: Java Core. Lecture# 4. Collections

Класс ArrayList

■ ArrayList ─ список на базе массива

■ порожден от класса AbstractList для

реализации списка, основанного на

динамически изменяющемся массиве

■ Нет методы addFirst() и addLast(), но есть

метод void add( int index, E element ) для

вставки элемента в произвольную позицию

Page 37: Java Core. Lecture# 4. Collections

Класс ArrayList

■ Плюсы

○ Быстрый доступ по индексу

○ Быстрая вставка и удаление элементов с

конца

■ Минусы

○ Медленная вставка и удаление

элементов

Page 38: Java Core. Lecture# 4. Collections

Вместимость ArrayList

■ Вместимость ─ реальное количество

элементов

■ Дополнительные методы

○ ensureCapacity(int c) ─ определение

вместимости

○ trimToSize() ─ “подгонка” вместимости

Page 39: Java Core. Lecture# 4. Collections

Конструкторы ArrayList

■ ArrayList() ─ пустой список

■ ArrayList(Collection c) ─ копия

коллекции

■ ArrayList(int initialCapacity) ─ пустой

список заданной вместимости

Page 40: Java Core. Lecture# 4. Collections

Применения ArrayList

■ “Бесконечный” массив

■ Стек

Page 41: Java Core. Lecture# 4. Collections

Пример использования ArrayList

public static void main(String args[]){

String s = "test";

List<String> list = new ArrayList<String>();

list.add( "is" );

list.add( "is" );

list.add( "a" );

list.add( "a" );

list.add( null );

list.add( list.size(), s );

list.add( 0, "This");

// list.add( new Double(12.4) ); ошибка компиляции

System.out.println( list );

displayCollection( list );

}

Page 42: Java Core. Lecture# 4. Collections

Пример использования ArrayList

Результат:

[This, is, is, a, a, null, test]

The size of the Collection is : 7

This is is a a null test

Page 43: Java Core. Lecture# 4. Collections

Класс LinkedList

■ LinkedList ─ двусвязный список

■ Порожден от класса

AbstractSequentialList

■ Реализация связанного

двунаправленного списка – каждый

элемент ссылается на предыдущий и на

последующий элементы

■ Есть методы addFirst() и addLast()

Page 44: Java Core. Lecture# 4. Collections

Класс LinkedList

■ Создаётся типизированная коллекция, в которой

могут храниться только элементы типа String:

■ LinkedList<String> list = new LinkedList<String>();

■ Любая попытка внести в список ссылку на объект

другого типа приведет к ошибке компиляции:

■ list.add( new Double(12.4) );

■ Плюсы

○ Быстрое добавление и удаление элементов

■ Минусы

○ Медленный доступ по индексу

Page 45: Java Core. Lecture# 4. Collections

Возможности LinkedList

■ Конструкторы

○ LinkedList() ─ пустой список

○ LinkedList(Collection c) ─ копия коллекции

■ Методы

○ addFirst(Object o) – добавить в начало

списка

○ addLast(Object o) – добавить в конец списка

○ removeFirst() – удалить первый элемент

○ removeLast() – удалить последний элемент

Page 46: Java Core. Lecture# 4. Collections

Применения LinkedList

■ Стек

■ Очередь

■ Дек

Page 47: Java Core. Lecture# 4. Collections

Пример. Вывод LinkedList на

экран

Пример использования LinkedList

import java.util.*;

public class TestList {

public static void main(String args[]){

String s = "test";

LinkedList<String> list = new LinkedList<String>();

list.add( "is" );

list.add( "is" );

list.add( "a" );

list.add( "a" );

list.add( null );

list.addLast( s );

list.addFirst("This");

// list.add( new Double(12.4) ); ошибка компиляции

System.out.println( list );

displayCollection( list );

}

Page 48: Java Core. Lecture# 4. Collections

Пример. Вывод LinkedList на

экран

static void displayCollection( Collection<String> items ) {

final String BLANK = " ";

System.out.println("The size of the Collection is : " +items.size());

StringBuilder sb = new StringBuilder();

for( String s : items ) sb.append( s ).append( BLANK );

System.out.println( sb.toString() );

}

}

Результат: [This, is, is, a, a, null, test]

The size of the Collection is : 7

This is is a a null test

Page 49: Java Core. Lecture# 4. Collections

Очередь

Page 50: Java Core. Lecture# 4. Collections

Очередь

■ Очередь – хранилище элементов для

обработки

■ Интерфейс Queue

■ Свойства очередей

○ Порядок выдачи элементов

определяется конкретной реализацией

○ Очереди не могут хранить null

○ У очереди может быть ограничен

размер

Page 51: Java Core. Lecture# 4. Collections

Методы очередей

■ Обычные методы

○ add(Object o) – добавить элемент

■ Бросает UnsupportedOperationException

○ Object element() – вершина очереди

■ Бросает NoSuchElementException

○ Object remove() – удалить элемент из вершины

■ Бросает NoSuchElementException

■ Методы, не бросающие исключений

○ offer(Object o) – добавить элемент

○ Object peek() – вершина очереди

○ Object poll() – удалить элемент из вершины

Page 52: Java Core. Lecture# 4. Collections

Отображение

Page 53: Java Core. Lecture# 4. Collections

Отображение

■ Отображение ─ множество пар ключ-значение

при уникальности ключа

■ Интерфейс Map

Page 54: Java Core. Lecture# 4. Collections

Методы отображений

■ Доступ

○ get(Object k) ─ получение значение

○ put(Object k, Object v) ─ запись

○ remove(Object k) ─ удаление

■ Проверки

○ containsKey(Object k) ─ наличие ключа

○ containsValue(Object v) ─ наличие значения

■ Определения размера

○ size() ─ размер отображения

○ isEmpty() ─ проверка на пустоту

Page 55: Java Core. Lecture# 4. Collections

Методы отображений

■ Взятие видов

○ entrySet() ─ множество пар

○ values() ─ коллекция значений

○ keySet() ─ множество ключей

■ Массовые операции

○ putAll(Map map) ─ добавление всех

пар

Page 56: Java Core. Lecture# 4. Collections

Пары

■ Пара ─ ключ + значение

■ Интерфейс Map.Entry

■ Методы

○ Object getKey()

○ Object getValue()

○ setValue(Object v)

Page 57: Java Core. Lecture# 4. Collections

Классы HashMap и LinkedHashMap

■ HashMap ─ отображение на основе

хэшей

■ LinkedHashMap ─ отображение на

основе хэшей с сохранением

порядка обхода

Page 58: Java Core. Lecture# 4. Collections

Конструкторы HashMap

■ HashMap() ─ пустое отображение

■ HashMap(Map m) ─ копия

отображения

■ HashMap(int initialCapacity) ─

начальная вместимость

■ HashMap (int initialCapacity, int

loadFactor) ─ начальная

вместимость и степень заполнения

Page 59: Java Core. Lecture# 4. Collections

Вопросы?