The 4th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
4. Коллекции в Java
■ «Платформы Java содержат набор
готовых классов, реализующих
механизмы работы со структурами
данных
■ Такие классы называются коллекциями
(collections)
■ Хотя обработка массивов происходит
быстрее, в ряде случаев требуется
использовать коллекции
5. Предпосылки использования
■ Необходимость динамического изменения
размера структуры данных
■ Динамическое добавление или удаление
элемента
■ Хранение разнотипных элементов
(объектов)
■ Извлечение и манипуляция данными из
БД
■ Хранение и работа со сложными
структурами данных (деревьями,
списками, стеками, хеш- таблицами и
т.д.) и т.п.
6. Базовые интерфейсы и
классы
■ Интерфейс Collection предназначен для
хранения однородных элементов. Его
расширяют интерфейсы:
■ List – список
■ Set – множество
■ Queue – очередь
■ Интерфейс Map предназначен для
создания коллекций, хранящих пары
«ключ-значение». Его реализуют классы:
■ HashMap
■ IdentityHashMap
■ TreeMap
8. Методы интерфейса
Collection
■ boolean add(Object o) – Добавляет элемент в коллекцию;
возвращает true если элемент был добавлен, и false, если
коллекция не позволяет сохранять дубликаты, а
добавляемый элемент таковым является.
■ boolean addAll(Collection coll) – Добавляет все элементы
в коллекцию; возвращает true если какой-либо элемент
был добавлен.
■ void clear() – Удаляет из коллекции все элементы. При
этом те элементы, на кот. имеются ссылки у других
элементов, не удаляются из памяти.
■ boolean contains(Object o) – Возвращает true если
коллекция содержит заданный элемент.
9. Методы интерфейса
Collection(продолжение)
▪ boolean containsAll(Collection<?> coll) – Возвращает true
если коллекция содержит все элементы из coll.
▪ boolean equals(Object o) – Возвращает true если
сравниваемые коллекции равны.
▪ int hashCode() – Возвращает значение хэш кода для
данной коллекции. Для любого класса, для которого
переопределен метод Object.equals() должен быть
переопределен метод Object.hashCode()
▪ boolean isEmpty() – Возвращает true если коллекция не
содержит элементов.
10. Методы интерфейса
Collection(продолжение)
■ Iterator iterator() – Возвращает ссылку на объект Iterator,
который позволяет выполнить эффективное,
последовательное прохождение по всем элементам
коллекции.
■ boolean remove(Object o) – Удаляет из коллекции
одиночный экземпляр элемента o; возвращает true, если
коллекция содержит такой элемент.
■ boolean removeAll(Collection<?> coll) – Удаляет их
коллекции все элементы, которые также находятся в
коллекции coll; возвращает true если какой-либо элемент
удален. Никакие элементы в результирующей коллекции
не будут равны элементам коллекции coll. Параметр coll
необязателен.
11. Методы интерфейса
Collection(продолжение)
■ boolean retainAll(Collection<?> coll) – Оставляет в
коллекции только те из входящих в неё элементов, которые
входят в коллекции coll; возвращает true, если исходная
коллекция изменена.
■ int size() – Возвращает количество элементов в коллекции.
■ Object[] toArray() – Возвращает массив, содержащий все
элементы данной коллекции.
12. Методы интерфейса
Collection(продолжение)
■ <T> T[] toArray(T[] a) – Возвращает массив, содержащий
все элементы данной коллекции; тип возвращаемого
массива таков, как тип заданного массива. Если коллекция
вмещается в заданный массив, она возвращается в
массиве. В противном случае размещается массив с типом
времени выполнения для заданного массива и размером
равным размеру коллекции.
■ String toString() – Возвращает строку со списком
элементов коллекции в квадратных скобках, через запятую
и пробел
15. Специфика хранения
элементов
■ Коллекции могут хранить только ссылки
на объекты.
■ Примитивные типы могут быть сохранены
в коллекции и извлечены из неё за счёт
автоматических операций упаковки и
распаковки в классы-оболочки (Boxing и
Unboxing, с Java SE 5)
■ Начиная с версии Java SE 5, коллекции
стали типизированными и при их создании
рекомендуется указывать тип объектов,
кот. будут храниться в ней
ArrayList<String> arr = new ArrayList<String>();
16. Пример. Вывод коллекции на экран
public void dump(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); ) {
String word = (String) i.next();
System.out.print(word + ", ");
}
System.out.println();
}
17. Преобразование в массив
■ Object[] toArray() ─ создает новый массив
■ Object[] toArray(Object[] a) ─ использует переданный
массив
■ Пример использования
String[] i = (String[])c.toArray(new String[c.size()]);
18. Итераторы
■ Итератор ─ обход коллекции
■ Интерфейс Iterator
■ Метод Iterator Collection.iterator()
19. Методы итераторов
■ hasNext() ─ определение наличия следующего
элемента
■ next() ─ взятие следующего элемента
■ remove() ─ удаление элемента
■ Исключения
○ NoSuchElementException ─ бросается при
достижении конца коллекции
○ ConcurrentModificationException ─ бросается при
изменении коллекции
20. Применение итераторов
■ Обход коллекции
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();
}
21. Пример работы с итераторами
List compon = Arrays.asList(this.getComponents());
for (Iterator iter=compon.iterator(); iter.hasNext(); ) {
Object elem = (Object) iter.next();
System.out.println(“Компонент: ”, elem.toString();
}
24. Сравнение элементов
■ Метод 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
25. Операции над множествами
■ addAll(Collection c) – объединение
множеств
■ retainAll(Collection c) – пересечение
множеств
■ containsAll(Collection c) – проверка
вхождения
■ removeAll(Collection c) – разность
множеств
26. Классы, реализующие Set
■ HashSet ─ множество на основе хэша
■ LinkedHashSet ─ множество на основе
хэша c сохранение порядка обхода
■ TreeSet - коллекция, которая хранит
свои элементы в виде упорядоченного
по значениям дерева.
27. Конструкторы HashSet
■ HashSet() ─ пустое множество
■ HashSet(Collection c) ─ элементы
коллекции
■ HashSet(int initialCapacity) ─
начальная вместимость
■ HashSet(int initialCapacity, double
loadFactor) ─ начальная
вместимость и степень заполнения
28. Вычисление хэшей
■ Метод Object.hashCode()
■ Устойчивость hashCode() не
изменяется, если объект не
изменяется
■ Согласованность с equals
o1.equals(o2) => o1.hashCode() ==
o2.hashCode()
29. Списки
■ Представляет собой неупорядоченную коллекцию, в которой
допустимы дублирующие значения
■ Классы, реализующие List:
■ LinkedList – связанный список, можно вставлять элементы
только в начало и конец
■ ArrayList – динамический массив с произвольной вставкой и
удалением элементов
■ Элементы, находящиеся в коллекции List проиндексированы
31. Методы интерфейса List
■ <T>Elem get(int i) – Возвращает ссылку на элемент
списка под номером i
■ int indexOf(<T> obj) – Возвращает индекс (номер)
элемента obj. Если объект не найден, возвращает -
1.
■ ListIterator listIterator([int i]) – Возвращает итератор
списка с дополнительными возможностями (по
сравнению с Iterator). Если указан параметр i, то
итератор будет позиционирован на элемент с
индексом i
32. Методы интерфейса List
■ boolean remove(int i) – удаляет из списка элемент с
номером i.
■ set(int i, <T> obj) – заменяет элемент с номером i на
указанный элемент obj
■ List subList(i1, i2) – возвращает ссылку на
подсписок, содержащий элементы исходного списка
с номерами от i1 до i2
33. Методы класса Collections
■ Collections.addAll(c,e1,e2,…,en) – добавляет в
коллекцию c произвольное число элементов e1, …,
en
■ frequency(c, obj) – возвращает число вхождений
элемента obj в коллекцию с
■ reverse(list) – обращает порядок следования
элементов в списке list
■ sort(list) – сортирует список в порядке возрастания
элементов. Сравнение идёт с помощью вызова
метода e1.compareTo(e2) для элементов списка e1,
e2
34. Итератор по списку
■ Интерфейс ListIterator extends Iterator
■ Метод listIterator()
■ Предыдущий / Следующий элементы
35. Операции итератора по списку
■ Передвижение
○ hasNext() / hasPrevious() ─ проверка
○ next() / previous() ─ взятие элемента
○ nextIndex() / previousIndex() ─
определение индекса
■ Изменение
○ remove() ─ удаление элемента
○ set(Object e) ─ изменение элемента
○ add(Object e) ─ добавление элемента
36. Класс ArrayList
■ ArrayList ─ список на базе массива
■ порожден от класса AbstractList для
реализации списка, основанного на
динамически изменяющемся массиве
■ Нет методы addFirst() и addLast(), но есть
метод void add( int index, E element ) для
вставки элемента в произвольную позицию
37. Класс ArrayList
■ Плюсы
○ Быстрый доступ по индексу
○ Быстрая вставка и удаление элементов с
конца
■ Минусы
○ Медленная вставка и удаление
элементов
38. Вместимость ArrayList
■ Вместимость ─ реальное количество
элементов
■ Дополнительные методы
○ ensureCapacity(int c) ─ определение
вместимости
○ trimToSize() ─ “подгонка” вместимости
39. Конструкторы ArrayList
■ ArrayList() ─ пустой список
■ ArrayList(Collection c) ─ копия
коллекции
■ ArrayList(int initialCapacity) ─ пустой
список заданной вместимости
41. Пример использования 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 );
}
…
43. Класс LinkedList
■ LinkedList ─ двусвязный список
■ Порожден от класса
AbstractSequentialList
■ Реализация связанного
двунаправленного списка – каждый
элемент ссылается на предыдущий и на
последующий элементы
■ Есть методы addFirst() и addLast()
44. Класс LinkedList
■ Создаётся типизированная коллекция, в которой
могут храниться только элементы типа String:
■ LinkedList<String> list = new LinkedList<String>();
■ Любая попытка внести в список ссылку на объект
другого типа приведет к ошибке компиляции:
■ list.add( new Double(12.4) );
■ Плюсы
○ Быстрое добавление и удаление элементов
■ Минусы
○ Медленный доступ по индексу
45. Возможности LinkedList
■ Конструкторы
○ LinkedList() ─ пустой список
○ LinkedList(Collection c) ─ копия коллекции
■ Методы
○ addFirst(Object o) – добавить в начало
списка
○ addLast(Object o) – добавить в конец списка
○ removeFirst() – удалить первый элемент
○ removeLast() – удалить последний элемент
47. Пример. Вывод 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 );
}
48. Пример. Вывод 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
50. Очередь
■ Очередь – хранилище элементов для
обработки
■ Интерфейс Queue
■ Свойства очередей
○ Порядок выдачи элементов
определяется конкретной реализацией
○ Очереди не могут хранить null
○ У очереди может быть ограничен
размер
51. Методы очередей
■ Обычные методы
○ add(Object o) – добавить элемент
■ Бросает UnsupportedOperationException
○ Object element() – вершина очереди
■ Бросает NoSuchElementException
○ Object remove() – удалить элемент из вершины
■ Бросает NoSuchElementException
■ Методы, не бросающие исключений
○ offer(Object o) – добавить элемент
○ Object peek() – вершина очереди
○ Object poll() – удалить элемент из вершины
54. Методы отображений
■ Доступ
○ get(Object k) ─ получение значение
○ put(Object k, Object v) ─ запись
○ remove(Object k) ─ удаление
■ Проверки
○ containsKey(Object k) ─ наличие ключа
○ containsValue(Object v) ─ наличие значения
■ Определения размера
○ size() ─ размер отображения
○ isEmpty() ─ проверка на пустоту
55. Методы отображений
■ Взятие видов
○ entrySet() ─ множество пар
○ values() ─ коллекция значений
○ keySet() ─ множество ключей
■ Массовые операции
○ putAll(Map map) ─ добавление всех
пар
56. Пары
■ Пара ─ ключ + значение
■ Интерфейс Map.Entry
■ Методы
○ Object getKey()
○ Object getValue()
○ setValue(Object v)
57. Классы HashMap и LinkedHashMap
■ HashMap ─ отображение на основе
хэшей
■ LinkedHashMap ─ отображение на
основе хэшей с сохранением
порядка обхода
58. Конструкторы HashMap
■ HashMap() ─ пустое отображение
■ HashMap(Map m) ─ копия
отображения
■ HashMap(int initialCapacity) ─
начальная вместимость
■ HashMap (int initialCapacity, int
loadFactor) ─ начальная
вместимость и степень заполнения