Коллекции, списки, итераторы
В Java получили широкое использование коллекции (Collections) – “умные” массивы с динамически изменяемой длиной, поддерживающие ряд важных дополнительных операций по сравнению с массивами. Базовым для иерархии коллекций является класс java.util.AbstractCollection. (В общем случае класс коллекции не обязан быть потомком AbstractCollection – он может является любым классом, реализующим интерфейс Collection).
Основные классы коллекций:
- Set, SortedSet, HashSet,TreeSet – множества (наборы неповторяющихся элементов)
- List, ArrayList,LinkedList,Vector – списки (упорядоченные наборы элементов, которые могут повторяться в разных местах списка)
- Map, Sorted Map – таблицы (списки пар “имя”-“значение”)
Доступ к элементам коллекции в общем случае не может осуществляться по индексу, так как не все коллекции поддерживают индексацию элементов. Эту функцию осуществляют с помощью специального объекта – итератора (iterator). У каждой коллекции collection имеется свой итератор который умеет с ней работать, поэтому итератор вводят следующим образом:
Iterator iter = collection.iterator()
У итераторов имеются следующие три метода:
boolean hasNext()- даёт информацию, имеется ли в коллекции следующий объект.
Object next() – возвращает ссылку на следующий объект коллекции.
void remove() – удаляет из коллекции текущий объект, то есть тот, ссылка на который была получена последним вызовом next().
Пример преобразования массива в коллекцию и цикл с доступом к элементам этой коллекции, осуществляемый с помощью итератора:
java.util.List components= java.util.Arrays.asList(this.getComponents());
for (Iterator iter = components.iterator();iter.hasNext();) {
Object elem = (Object) iter.next();
javax.swing.JOptionPane.showMessageDialog(null,"Компонент: "+
elem.toString());
}
Основные методы коллекций:
Имя метода | Действие |
boolean add(Object obj) | Добавление объекта в коллекцию (в конец списка). Возвращает true в случае успешного добавления - изменения коллекции. Коллекция может не позволить добавление элементов несовместимого типа или не подходящих по какому-либо другому признаку. |
boolean addAll(Collection c) | Добавление в коллекцию всех объектов из другой коллекции. Возвращает true в случае успешного добавления, то есть если добавлен хотя бы один элемент. |
void clear() | Очистка коллекции - удаление из неё ссылок на все входящие в коллекцию объекты. При этом те объекты, на которые имеются ссылки у других элементов программы, не удаляются из памяти. |
boolean contains(Object obj) | Возвращает true в случае, если коллекция содержит объект obj. Проверка осуществляется с помощью поочерёдного вызова метода obj.equals(e) для элементов e, входящих в коллекцию. |
boolean containsAll(Collection c) | Возвращает true в случае, если коллекция содержит все элементы коллекции c. |
boolean isEmpty() | Возвращает true в случае, если коллекция пуста, то есть не содержит ни одного элемента. |
Iterator iterator() | Возвращает ссылку на итератор – объект, позволяющий получать поочерёдный доступ к элементам коллекции. Для одной коллекции разрешается иметь произвольное число объектов-итераторов, в том числе – разных типов. В процессе работы они могут указывать на разные элементы коллекции. После создания итератор всегда указывает на начало коллекции – вызов его метода next() даёт ссылку на начальный элемент коллекции. |
boolean remove(Object obj) | Удаляет из коллекции первое встретившееся вхождение объекта obj. Поиск и удаление осуществляется с помощью итератора. Возвращает true в случае, если удаление удалось, то есть если коллекция изменилась. |
boolean remove All(Collection c) | Удаляет из коллекции все элементы коллекции c. Возвращает true в случае, если удаление удалось, то есть если коллекция изменилась. |
boolean retainAll(Collection c) | Оставляет в коллекции только те из входящих в неё элементов, которые входят в коллекцию c. |
int size() | Возвращает число элементов в коллекции. |
Object[] toArray() | Возвращает массив ссылок на объекты, содержащиеся в коллекции. То есть преобразует коллекцию в массив. |
T[] toArray(T[n] a) | Возвращает массив элементов типа T, полученных в результате преобразования элементов, содержащихся в коллекции. То есть преобразует коллекцию в массив. Если число элементов коллекции не превышает размер n массива a, размещение данных производится в существующих ячейках памяти, отведённых под массив. Если превышает n – в памяти динамически создаётся и заполняется новый набор ячеек, и их число делается равным числу элементов коллекции. После чего переменная a начинает ссылаться на новый набор ячеек. |
String toString() | Метод переопределён – он возвращает строку со списком элементов коллекции. В списке выводятся заключённые в квадратные скобки строковые представления элементов, разделяемые комбинацией “, ” – запятая с пробелом после неё. |
Самыми распространёнными вариантами коллекций являются списки (Lists). Они во многом похожи на массивы, но отличаются от массивов тем, что в списках основными операциями являются добавление и удаление элементов. А не доступ к элементам по индексу, как в массивах.
В классе List имеются методы коллекции, а также ряд дополнительных методов:
list.get(i) – получение ссылки на элемент списка list по индексу i.
list.indexOf(obj) - получение индекса элемента obj в списке list. Возвращает -1 если объект не найден.
list.listIterator(i) – получение ссылки на итератор типа ListIterator, обладающего дополнительными методами по сравнению с итераторами типа Iterator.
list.listIterator(i) – то же с позиционированием итератора на элемент с индексом i.
list.remove(i) – удаление из списка элемента с индексом i.
list.set(i,obj) – замена в списке элемента с индексом i на объект obj.
list.subList(i1,i2) – возвращает ссылку на подсписок, состоящий из элементов списка с индексами от i1 до i2.
Кроме них в классе List имеются и многие другие полезные методы.
Ряд полезных методов для работы с коллекциями содержится в классе Collections:
Collections.addAll(c,e1,e2,…,eN) - добавление в коллекцию c произвольного числа элементов e1,e2,…,eN.
Collections.frequency(c,obj) – возвращает число вхождений элемента obj в коллекцию c.
Collections.reverse(list) – обращает порядок следования элементов в списке list (первые становятся последними и наоборот).
Collections.sort(list) – сортирует список в порядке возрастания элементов. Сравнение идёт вызовом метода e1.compareTo(e2) для очередных элементов списка e1 и e2.
Кроме них в классе Collections имеются и многие другие полезные методы.
В классе Arrays имеется метод
Arrays.asList(a) – возвращает ссылку на список элементов типа T, являющийся оболочкой над массивом T[] a. При этом и массив, и список содержат одни и те же элементы, и изменение элемента списка приводит к изменению элемента массива, и наоборот.