Spec-Zone .ru
спецификации, руководства, описания, API
|
A Collection
представляет группу объектов, известных как ее элементы. Collection
интерфейс используется, чтобы раздать наборы объектов, где максимальная общность требуется. Например, условно у всех реализаций набора общего назначения есть конструктор, который берет a Collection
параметр. Этот конструктор, известный как конструктор преобразования, инициализирует новый набор, чтобы содержать все элементы в указанном наборе, безотносительно подынтерфейса данного набора или типа реализации. Другими словами это позволяет Вам преобразовывать тип набора.
Предположите, например, что у Вас есть a Collection<String> c
, который может быть a List
, a Set
, или другой отчасти Collection
. Эта идиома создает новое ArrayList
(реализация List
интерфейс), первоначально содержащий все элементы в c
.
List<String> list = new ArrayList<String>(c);
Следующие шоу Collection
интерфейс.
public interface Collection<E> extends Iterable<E> { // Basic operations int size(); boolean isEmpty(); boolean contains(Object element); // optional boolean add(E element); // optional boolean remove(Object element); Iterator<E> iterator(); // Bulk operations boolean containsAll(Collection<?> c); // optional boolean addAll(Collection<? extends E> c); // optional boolean removeAll(Collection<?> c); // optional boolean retainAll(Collection<?> c); // optional void clear(); // Array operations Object[] toArray(); <T> T[] toArray(T[] a); }
Интерфейс делает, о каком Вы ожидали бы, учитывая, что a Collection
представляет группу объектов. У интерфейса есть методы, чтобы сказать Вам, сколько элементов находится в наборе (size
, isEmpty
), чтобы проверить, является ли данный объект в наборе (contains
), чтобы добавить и удалить элемент из набора (add
, remove
), и обеспечить iterator по набору (iterator
).
add
метод определяется обычно достаточно так, чтобы он имел смысл для наборов, которые позволяют копии так же как тех, которые не делают. Это гарантирует что Collection
будет содержать указанный элемент после того, как вызов завершается, и возвраты true
если Collection
изменения в результате вызова. Точно так же remove
метод разрабатывается, чтобы удалить единственный экземпляр указанного элемента от Collection
, принятие, что это содержит элемент, чтобы запуститься с, и возвратиться true
если Collection
был изменен в результате.
Есть два способа пересечь наборы: (1) с for-each
создайте и (2) при использовании Iterator
s.
for-each
конструкция позволяет Вам кратко пересекать набор или массив, использующий a for
цикл — видит for-each
создайте, чтобы распечатать каждый элемент набора на отдельной строке.
for (Object o : collection) System.out.println(o);
Iterator
объект, который позволяет Вам пересечь через набор и удалить элементы из набора выборочно при желании. Вы добираетесь Iterator
для набора, вызывая iterator
метод. Следующее Iterator
интерфейс.
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); //optional }
hasNext
возвраты метода true
если у итерации есть больше элементов, и next
метод возвращает следующий элемент в итерации. remove
метод удаляет последний элемент, который был возвращен next
от базового Collection
. remove
однажды метод можно вызвать только на звонок next
и выдает исключение, если это правило нарушается.
Отметьте это Iterator.remove
единственный безопасный способ изменить набор во время итерации; поведение является неуказанным, если базовый набор изменяется каким-либо другим способом, в то время как итерация происходит.
Использовать Iterator
вместо for-each
создайте, когда Вы нуждаетесь к:
for-each
конструкция скрывает iterator, таким образом, невозможно вызвать remove
. Поэтому, for-each
конструкция не применима для того, чтобы фильтровать.Следующий метод показывает Вам, как использовать Iterator
фильтровать произвольное Collection
— то есть, пересеките набор, удаляющий определенные элементы.
static void filter(Collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); }
Эта простая часть кода является полиморфной, что означает, что это работает на любого Collection
независимо от реализации. Этот пример демонстрирует, как легкий это должно записать полиморфный алгоритм, используя Платформу Наборов Java.
Объемные операции выполняют работу на всем Collection
. Вы могли реализовать эти краткие операции, используя основные операции, хотя в большинстве случаев такие реализации будут менее эффективными. Следующее является объемными операциями:
containsAll
— возвраты true
если цель Collection
содержит все элементы в указанном Collection
.addAll
— добавляют все элементы в указанном Collection
к цели Collection
.removeAll
— удаляет из цели Collection
все его элементы, которые также содержатся в указанном Collection
.retainAll
— удаляет из цели Collection
все его элементы, которые также не содержатся в указанном Collection
. Таким образом, это сохраняет только те элементы в цели Collection
это также содержится в указанном Collection
.clear
— удаляет все элементы из Collection
. addAll
, removeAll
, и retainAll
методы весь возврат true
если цель Collection
был изменен в процессе выполнения работы.
Как простой пример питания объемных операций, полагайте, что следующая идиома удаляет все экземпляры указанного элемента, e
, от a Collection
, c
.
c.removeAll(Collections.singleton(e));
Более определенно предположите, что Вы хотите удалить весь из null
элементы от a Collection
.
c.removeAll(Collections.singleton(null));
Эта идиома использование Collections.singleton
, который является статическим методом фабрики, который возвращает неизменное Set
содержа только указанный элемент.
toArray
методы обеспечиваются как мост между наборами и более старыми API, которые ожидают массивы на вводе. Операции над массивом позволяют содержание a Collection
быть преобразованным в массив. Простая форма без параметров создает новый массив Object
. Более сложная форма позволяет вызывающей стороне предоставлять массиву или выбирать тип времени выполнения выходного массива.
Например, предположите это c
a Collection
. Следующий отрывок выводит содержание c
в недавно выделенный массив Object
чья длина идентична числу элементов в c
.
Object[] a = c.toArray();
Предположите это c
как известно, содержит только строки (возможно, потому что c
имеет тип Collection<String>
). Следующий отрывок выводит содержание c
в недавно выделенный массив String
чья длина идентична числу элементов в c
.
String[] a = c.toArray(new String[0]);