Интерфейс Collection в Java

Корневой интерфейс в иерархии коллекции. Коллекция представляет собой группу объектов, называемых ее элементами. Некоторые коллекции позволяют дублировать элементы, а другие нет. Некоторые упорядочены, а другие нет. JDK не предоставляет прямых реализаций этого интерфейса: он предоставляет реализации более конкретных подинтерфейсов, таких как Set и List. Этот интерфейс обычно используется для передачи коллекций и управления ими там, где требуется максимальная универсальность. Пакеты или мультимножества (неупорядоченные коллекции, которые могут содержать повторяющиеся элементы) должны реализовывать этот интерфейс напрямую.

Все универсальные классы реализации Collection (которые обычно реализуют Collection косвенно через один из ее подинтерфейсов) должны предоставлять два «стандартных» конструктора: конструктор void (без аргументов), который создает пустую коллекцию, и конструктор с одним аргументом типа Collection, которая создает новую коллекцию с теми же элементами, что и ее аргумент. Фактически, последний конструктор позволяет пользователю копировать любую коллекцию, создавая эквивалентную коллекцию желаемого типа реализации. Невозможно обеспечить соблюдение этого соглашения (поскольку интерфейсы не могут содержать конструкторы), но все реализации общего назначения Collection в библиотеках платформы Java соответствуют.

Определенные методы указаны как необязательные. Если реализация коллекции не реализует конкретную операцию, она должна определить соответствующий метод для выдачи исключения UnsupportedOperationException. Такие методы отмечены как «необязательные операции» в спецификациях методов интерфейсов коллекций.

Некоторые реализации коллекций имеют ограничения на элементы, которые они могут содержать. Например, некоторые реализации запрещают нулевые элементы, а некоторые имеют ограничения на типы их элементов. Попытка добавить неподходящий элемент вызывает непроверенное исключение, обычно NullPointerException или ClassCastException. Попытка запросить наличие неподходящего элемента может вызвать исключение или просто вернуть false; некоторые реализации будут демонстрировать первое поведение, а некоторые - второе. В более общем смысле, попытка операции с неподходящим элементом, завершение которой не приведет к вставке неприемлемого элемента в коллекцию, может вызвать исключение или может быть успешной по выбору реализации. Такие исключения помечены как «необязательные» в спецификации для этого интерфейса.

Каждая коллекция определяет собственную политику синхронизации. В отсутствие более строгой гарантии со стороны реализации неопределенное поведение может быть результатом вызова любого метода в коллекции, которая изменяется другим потоком; сюда входят прямые вызовы, передача коллекции методу, который может выполнять вызовы, и использование существующего итератора для проверки коллекции.

Многие методы в интерфейсах Collections Framework определены в терминах метода equals. Например, спецификация для метода contains(Object o) гласит: «возвращает true тогда и только тогда, когда эта коллекция содержит хотя бы один элемент e такой, что (o==null ? e==null : o.equals(e))." Эта спецификация не должна толковаться как подразумевающая, что вызов Collection.contains с ненулевым аргументом o вызовет вызов o.equals(e) для любого элемента e. Реализации могут свободно реализовывать оптимизацию, посредством которой избегается вызов равенства, например, сначала путем сравнения хэш-кодов двух элементов. (Спецификация Object.hashCode() гарантирует, что два объекта с неравными хэш-кодами не могут быть равными.) В более общем плане, реализации различных интерфейсов Collections Framework могут свободно использовать преимущества указанного поведения базовых методов Object везде, где разработчик сочтет это целесообразным.

Некоторые операции сбора, которые выполняют рекурсивный обход коллекции, могут завершиться ошибкой, за исключением экземпляров, ссылающихся на себя, где коллекция прямо или косвенно содержит себя. Сюда входят методы clone(), equals(), hashCode() и toString(). Реализации могут опционально обрабатывать самореферентный сценарий, однако большинство текущих реализаций этого не делают.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки