Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Collections Framework

Поиск:
Спасибо большое LSD за предоставленную информацию

Статья выходит в первом релизе - возможны кое-какие дополнения.

Java Collections Framework - это набор классов и интерфейсов, предназначенных для хранения и манипулирования группами объектов. CF - состоит из интерфейсов, описывающих "коллекции", их конкретных реализаций и утилит по работе с "коллекциями" и массивами. Поскольку "коллекции" описывают универсальные интерфейсы, то не все операции могут быть применимы к конкретной реализации. Как правило, если метод возвращает булевское значение, то true означает, что коллекция изменилась в результате операции, false - нет. Если метод возвращает Object, как правило, это текущий или удаляемый элемент. Все классы в CF работают только с объектами, если надо хранить примитивные типы то это надо делать через классы "оболочки" (Integer, Double, Boolean и т.д.). Допустимость нулевых элементов зависит от реализации. Идентичность объектов определяется, используя метод boolean equals(Object), за исключением IdentityHashMap. Классы CF размещаются в пакете java.util.

В коллекциях часто используется понятие итератора - это класс, который позволяет перебрать все элементы коллекции по одному. Enumeration самый первый интерфейс для итераторов содержит методы: boolean hasMoreElements() возвращает true если еще остались не перечисленные элементы, Object nextElement() - возвращает текущий элемент и переходит к следующему, если достигнут конец, то выбрасывается исключение NoSuchElementException. Iterator - это обновленная версия Enumeration, содержит методы boolean hasNext() и Object next() аналогичные методам Enumeration и один новый метод void remove(), который позволяет удалить текущий элемент (данный метод может не поддерживаться). ListIterator - это расширение интерфейса Iterator, который позволяет перемещаться по списку в обе стороны, добавлять, удалять и изменять объекты в списке. Добавлены методы boolean hasPrevious() и Object previous() аналогичные boolean hasNext() и Object next(), int nextIndex() и int previousIndex() - позволяют узнать номер следующего и предыдущего элемента в списке, void add(Object) и void set(Object) - позволяют вставить и заменить текущий объект.

Для сортировки элементов существуют 2 интерфейса - Comparable и Comparator. Объекты, реализующие интерфейс Comparable, могут быть сравнены друг, с другом используя метод int compareTo(Object). Метод возвращает отрицательное число, если данный объект должен стоять раньше указанного, положительное если после, иначе ноль. Объекты, реализующие интерфейс Comparator, могут сравнивать два объекта, используя метод int compare(Object, Object) , метод возвращает отрицательное число, если первый объект должен стоять раньше указанного, положительное если после, иначе ноль. Все классы "оболочки" и String реализуют интерфейс Comparable, строки реализуют регистрозависимую сортировку.

Базовым интерфейсом для коллекций является Collection. Он описывает основные методы по работе с коллекциями, добавление, удаление и проверка наличия в коллекции как одного объекта - boolean add(Object), boolean remove(Object), boolean contains(Object), так и другой коллекции - boolean addAll(Collection), boolean removeAll(Collection), boolean containsAll(Collection). Дополнительно есть две операции, работающие с группами объектов: boolean retainAll(Collection) - оставить в коллекции только элементы, которые содержатся в коллекции переданной в виде аргумента и void clear() - удалить все элементы из коллекции. Методы boolean isEmpty() и int size() позволяют узнать пустая ли коллекция и сколько в ней элементов. Метод Iterator iterator() возвращает итератор над данной коллекцией. Методы Object[] toArray() и Object[] toArray(Object[]) позволяют преобразовать коллекцию в массив, второй метод позволяет указать тип элементов результирующего массива (если какой-нибудь элемент коллекции не приводим к данному типу, то буде выброшено исключение). Например, есть коллекция, содержащая только строки, преобразовать ее в массив строк можно следующим образом: String[] strings = (String[]) collect.toArray(new String[0]);.

Интерфейс List - расширяет интерфейс Collection для представления списков. Добавлены методы для манипуляции с объектом по его номеру в списке: void add(int,Object), boolean addAll(int,Collection), Object remove(int), Object set(int,Object), Object get(int), метод для получения подсписка List subList(int,int) и методы для получения ListIterator-а ListIterator listIterator() и ListIterator listIterator(int), второй позволяет начинать с указанного номера. Все методы производят проверку на допустимый диапазон. В CF есть 4 реализации этого интерфейса: ArrayList, LinkedList, Vector и Stack они все допускают нулевые элементы. ArrayList и Vector это массиво-подобные реализации списков, имеют фиксированное время доступа к элементам, вставка/удаление элементов в список происходит за достаточно большое время (за исключением последнего элемента). Vector в отличие от ArrayList синхронизирован. LinkedList - представляет собой двусвязный список, имеет фиксированное время вставки/удаления элементов и длительное время доступа к произвольному элементу списка. Stack расширяет класс Vector и реализует основные операции со стеком: push(), pop(), peek() и search().

Интерфейс Set - расширяет интерфейс Collection для представления множеств. Множество может содержать не более одного экземпляра объекта. Реализации - HashSet и LinkedHashSet. Порядок перебора элементов итератором не определен, нулевой элемент допускается. Развитием Set является SortedSet который, описывает упорядоченное множество. Элементы перебираются в восходящем порядке. Добавляемые элементы должны реализовывать интерфейс Comparable или должен быть задан внешний Comparator. Добавлены методы Object first() и Object last() первый и последний элемент, SortedSet headSet(Object) подмножество от начала, до указанного элемента не включая сам элемент, и SortedSet tailSet(Object) подмножество от указанного элемента включительно до конца, SortedSet subSet(Object,Object) подмножество от первого элемента включительно, до последнего, исключая последний. Реализация - TreeSet. Обеспечивает время порядка log(n), для операций доступа, вставки и удаления, если не задан Comparator, нулевой элемент не допускается.

Интерфейс Map - не расширяет интерфейс Collection, но тоже принадлежит к CF. Map описывает соответствие между парами объектов, первый называется ключом, второй значением. Одному ключу соответствует только одно значение (или ни одного), значению может соответствовать произвольное количество ключей. Основные методы: Object put(Object,Object) - добавить новую пару ключ-значение, Object get(Object) - получить значение для соответствующего ключа, Object remove(Object) - удалить соответствующую пару ключ-значение, boolean containsKey(Object) и boolean containsValue(Object) - проверить есть ли соответствующий ключ/значение (containsKey() не эквивалентен (get() == null), т.к. для ключа допускается явная установка значения null), Set keySet(), Set entrySet() и Collection values() - множество ключей, множество значений и коллекцию значений соответственно, int size(), boolean isEmpty(), void clear(), void putAll(Map) - эквивалентны соответствующим значениям в Collection. Реализации - Hashtable, HashMap, IdentityHashMap и WeakHashMap. Hashtable и HashMap - общеупотребительные реализации Map, Hashtable в отличие от HashMap синхронизирован. IdentityHashMap использует для определения эквивалентности ключей используется не equals(Object), а ==, предназначен, в основном, для использования при сериализации объектов. WeakHashMap реализация Map, которая для хранения ключей использует WeakHashMap, предназначенная в основном для кэширования объектов.

Интерфейс SortedMap - расширяет интерфейс Map для представления отсортированных пар ключ-значение, сортировка осуществляется по ключам. Методы Comparator comparator(), Object firstKey(), Object lastKey(), SortedMap headMap(Object), SortedMap tailMap(Object) и SortedMap subMap(Object,Object) аналогичны соответствующим методам в интерфейсе SortedSet. Реализация - использует древовидную структуру для хранения ключей, обеспечивает время порядка log(n), для операций доступа, вставки и удаления, если не задан Comparator, нулевой элемент не допускается.

В CF существует два класса содержащих статические методы по работе с коллекциями и массивами.

Collections - позволяет: создать неизменяемую коллекцию на базе уже существующей Collections.unmodifiable<интерфейс>() и создать синхронизированную коллекцию на базе уже существующей Collections.synchronized<интерфейс>(), где <интерфейс> это - Collection, List, Set, SortedSet, Map или SortedMap. Создать неизменяемый Set, List или Map содержащие только один элемент - Set singleton(Object), List singletonList(Object), Map singletonMap(Object,Object). И функции по работе со списками: max()/min(), sort(), rotate(), shuffle(), reverse(), copy() - поиск минимального/максимального элемента, сортировка, сдвиг, перемешать в случайном порядке, поменять порядок на обратный, скопировать из одного списка в другой и т.д.

Arrays - содержит функции по работе с массивами: int binarySearch(<тип>[],<тип>) - быстрый поиск в массиве заданного элемента за время порядка log(n), массив должен быть отсортирован в порядке возрастания, если искомых элементов несколько, то нельзя предсказать какой будет найден, возвращается номер искомого элемента или номер элемента, перед которым должен быть вставлен искомый элемент, чтобы массив остался отсортированным. Метод void sort(<тип>[],int,int) - сортирует массив в порядке возрастания на указанном интервале (нижняя граница включается, верхняя - нет), если не указать интервал, то будет отсортирован весь массив. Метод boolean equals(<тип>[],<тип>[]) - проверяет два массива на равенство, объекты сравниваются, используя метод boolean equals(Object). Метод fill(<тип>[],<int>,<int>,<тип>) - позволяет заполнить массив указанным значением на указанном интервале (нижняя граница включается, верхняя - нет), если не указать интервал, то будет заполнен весь массив. Метод List asList(Object[]) - позволяет получить список фиксированного размера, состоящий из элементов массива. Под <тип> понимается один из примитивных типов или Object. Для методов sort() и binarySearch() при работе с Object может быть указан Comparator, если для сортировки массива использовался не стандартный Comparator, то он же должен быть использован и при поиске.
Автор: AntonSaburov
Сайт: http://






Просмотров: 4963

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную