Top.Mail.Ru

Перечень уроков по Java

29, Основные интерфейсы коллекций

Рассмотрим наиболее часто используемые интерфейсы коллекций:   List (список), Set (множество) и Map (отображение). В документации - java.util определены интерфейсы:

интерфейс Collection
              |
              +------- интерфейс List
              |
              +------- интерфейс Set
интерфейс Map

  • Интерфейс Collection — базовый интерфейс, который описывает методы, которыми должна обладать любая коллекция, поэтому общие принципы работы с коллекциями будут одни и те же.
  • Интерфейс List — это список

Основные свойства: список может содержать одинаковые элементы, порядок хранения элементов не меняться при добавлении или удалении элементов, доступ к элементам списка осуществляется по индексу.

Основные методы: объекты можно добавлять в список (метод add()), заменять в списке (метод set()), удалять из списка (метод remove()), извлекать (метод get()). Существует также возможность организации прохода по списку при помощи итератора.

  • Интерфейс Set — множество

Основные свойства: множество не может содержать одинаковые элементы, порядок хранения элементов может меняться при добавлении или удалении элементов. Добавление одного и того же объекта в множество не изменяет само множество

Основные методы: объекты можно добавлять в список (метод add()),удалять из списка (метод remove()), найти (метод contains()). Существует также возможность организации прохода по списку при помощи итератора.

  • Интерфейс Map — отображение (карта) или ассоциативный массив.

Основные свойства: В Map мы добавляем не отдельные объекты, а пары объектов (ключ, значение). Доступ к значению в коллекции получаем по ключу.

Основные методы: объекты можно найти по ключу containsKey() или по значению containsValue(),  извлечь по ключу  get(), установить по ключу keySet(), установить пару  put(Object key, Object value), извлечь множество значений Collection values(). Из карты (Map) можно получить множество (Set) ключей и список (List) значений.

 

Итераторы

В коллекциях широко используются итераторы.

В Java итератор — это вспомогательный объект, используемый для прохода по коллекции объектов.

Любой итератор имеет следующие три метода:

  • boolean hasNext() — возвращает true, если есть следующий элемент в коллекции
  • Object next() — выдает очередной элемент коллекции
  • void remove() — удаляет последний выбранный элемент из коллекции.

 Все классы коллекций обеспечивают поддержку итераторов.

Пример.

Предположим, что имеется коллекция с1. Используя итератор, выполним проход по элементам коллекции.

 System.out.println("Проход по коллекции через итератор");

     // Метод итератора hasNext() возвращает true

     // если итератор может переместиться к следующему элементу

   for(Iterator it= c1.iterator(); it.hasNext();)

      {

     // Метод итератора next() перемещается на следующий элемент

     // и возвращает его значение

     int x = (int) it.next();

     System.out.println("элемент:" + x);

      }

В версии 5.0 появилась более компактная запись цикла   for(Iterator it  …}. Предыдущий цикл с итератором можно записать следующим образом:

  // Основной способ прохода по коллекции

        System.out.println("Проход по коллекции");

        for(Object o :c1)

            System.out.println(o);

 

Универсальные типы

Интерфейс Collection определен следующим образом

public interface Collection<E>

{

    //описание методов

}

Буква <E> (анг. Element) в угловых скобках говорит о том, что используется универсальный параметр, вместо него необходимо  подставить конкретный тип. Угловые скобки говорят о том, что этот тип «для подстановки». Причем буква E  условна, это может и любая другая буква.

Универсальный тип означает, что интерфейс работает с любым типом, кроме примитивных типов. Вместо примитивных типов надо использовать классы-обертки: Integer вместо int, Double вместо double. Подставляя  вместо <E> конкретный тип объектов, например, String или пользовательский тип (класс), мы указываем компилятору на необходимость проверки правильности использования указанного типа объектов во время компиляции. В противном случае, без использования этого механизма проверки типов, ошибка неправильного использования  типов объектов возникнет позже – на этапе выполнения кода программы.

Таким образом, механизм универсального типа помогает определять ошибки с помощью встроенного алгоритма проверки типов объектов во время компиляции.