Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Collection в Java: общий интерфейс для набора элементов

💻 Информатика · 10 класс

size, add, remove, contains и обход: что гарантирует интерфейс и что зависит от реализации.

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Интерфейс и объект

Collection<E> описывает общие операции над группой элементов. Это интерфейс, а не конкретный способ хранения. Объект создают через реализацию, например ArrayList или HashSet. Тип E указывает тип элементов; для целых чисел используют Integer, а не примитив int.

Collection<String> names = new ArrayList<>();
names.add("Mira");
names.add("Oleg");
names.add("Mira");

Для этого фрагмента нужны импорты java.util.Collection и java.util.ArrayList. В выбранной реализации три элемента, включая повтор. Сам Collection не обещает ни разрешения повторов, ни порядка, одинакового для всех реализаций.

Основные операции

МетодСмысл
size()Количество элементов
isEmpty()Нет ли элементов
contains(x)Есть ли подходящий по правилам равенства элемент
add(x)Попытка добавить элемент
remove(x)Удаление одного подходящего элемента, если он найден
iterator()Итератор для обхода

Изменяющие операции могут быть необязательными: некоторые коллекции выбрасывают UnsupportedOperationException. Поэтому наличие метода в интерфейсе не означает, что любой объект позволит изменить содержимое. Ограничения на null также зависят от реализации.

Разобранный пример

Для names из примера вызов names.size() даст 3, names.contains("Mira") — true. После names.remove("Mira") в ArrayList останутся Oleg и Mira, размер станет 2. Удаляется одно вхождение, а не все одноимённые элементы.

Если вместо ArrayList использовать HashSet, повторное добавление равного значения не увеличит размер. Тогда исходный набор будет содержать два разных имени. Это иллюстрирует различие интерфейса и конкретного поведения выбранной структуры.

Обход и изменение

for (String name : names) {
    System.out.println(name);
}

Collection наследует Iterable, поэтому его можно обходить таким циклом. Однако удалять элементы через саму коллекцию во время обычного обхода часто нельзя без нарушения правил итератора. Для удаления по условию может подойти removeIf, если реализация поддерживает изменение; другой вариант — корректно использовать Iterator.remove.

Collection, Collections и Map

Collection — интерфейс. Collections — отдельный служебный класс со статическими алгоритмами и обёртками. Map хранит пары «ключ — значение» и не является подклассом Collection, хотя предоставляет представления ключей и значений в виде коллекций.

Задания

  1. Сколько элементов получится после добавления 1, 1, 2 в ArrayList и HashSet?
  2. Можно ли создать new Collection<String>() без реализации методов?
  3. Почему вызов add может завершиться UnsupportedOperationException?

Ответы

1. 3 в списке и 2 во множестве. 2. Нет: интерфейс требует реализации; для обычной работы выбирают конкретный класс. 3. Конкретная коллекция может не поддерживать изменение, хотя операция присутствует в общем контракте.

Частая ошибка

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

Связанные материалы

Источники и материалы