Вплоть до Java 2, Java предоставляла особые классы, такие как Dictionary, Vector, Stack, и Properties для хранения и управления группами объектов. Хоть эти классы были полезными, им не хватало центральной, объединяющей тематики. Именно поэтому то, как вы использовали Vector отличается от того, как вы использовали Properties.
Структура коллекций в Java была создана для того чтобы удовлетворять таким целям, как:
- Фреймворк должен быть высокопроизводительным. Реализации фундаментальных коллекций (динамические массивы, связанные списки, деревья и хэш-таблицы) должны быть высокоэффективными.
- Фреймворк должен позволять разным типам коллекций работать аналогичным образом и с высокой степенью совместимости.
- Фреймворк должен уметь расширяться и/или легко адаптировать коллекцию
С этой целью вся структура коллекций разработана вокруг набора стандартных интерфейсов. Несколько стандартных реализаций типа LinkedList, HashSet, и TreeSet из этих интерфейсов предоставляются таким образом, что вы можете их использовать «как есть» или можете реализовать свою собственную коллекцию по вашему выбору.
Фреймворк коллекций – это объединённая архитектура для представления и управления коллекциями. Все структуры коллекций содержат в себе следующее:
- Интерфейсы – это абстрактные типы данных, которые представляют коллекции. Интерфейсы позволяют управлять коллекциями вне зависимости от деталей их представления. В объектно-ориентированных языках интерфейсы обычно формируют иерархию.
- Реализации, т.e. классы – Это конкретные реализации интерфейсов коллекций. По сути, они являются структурными данных, которые можно многократно использовать.
- Алгоритмы – это методы, которые выполняют полезные вычисления с объектами, которые реализуют интерфейсы коллекций, например поиск и сортировку. Алгоритмы считаются полиморфными, то есть один и тот же метод может быть использован во множестве различных реализаций соответствующего интерфейса коллекций.
Помимо коллекций, фреймворк определяет некоторые интерфейсы и классы карт. Карты хранят пары ключ/значение. Хоть карты не являются коллекциями в обычном их понимании, но они полностью интегрированы с коллекциями.
Интерфейсы коллекций
Структура коллекций определяет некоторые интерфейсы в Java. Этот раздел вкратце описывает каждый из них.
№ | Интерфейс и описание |
1 | Интерфейс Collection Позволяет работать с группами объектов; находится на вершине иерархии коллекций. |
2 | Интерфейс List Расширяет Collection и экземпляр List хранит упорядоченный набор элементов. |
3 | Интерфейс Set Расширяет Collection, чтобы обрабатывать наборы, которые должны содержать уникальные элементы. |
4 | SortedSet Расширяет Set для обработки отсортированных наборов. |
5 | Map Привязывает уникальные ключи к значениям |
6 | Map.Entry Описывает элемент (пара ключ/значение) в карте. Это внутренний класс Map. |
7 | SortedMap Расширяет Map так, чтобы ключи были расположены в порядке возрастания. |
8 | Enumeration Устаревший интерфейс, определяющий методы, которым вы можете перечислить (получать по одному за раз) элементы в коллекции объектов. Этот устаревший интерфейс был заменен Iterator |
Классы коллекций
Java предоставляет набор стандартных классов коллекции, которые реализуют интерфейсы Collection. Некоторые из классов предоставляют полные реализации, которые могут быть использованы как есть, а другие являются абстрактным классом, предоставляя скелетные реализации, которые используются как начальные точки для создания конкретных коллекций.
Стандартные классы коллекций в Java приведены в следующей таблице:
№ | Класс и описание |
1 | AbstractCollection Реализует большую часть интерфейса Collection |
2 | AbstractList Расширяет AbstractCollection и реализует большую часть интерфейса List |
3 | AbstractSequentialList Расширяет AbstractList для использования коллекцией, которая использует последовательный, а не произвольный доступ к своим элементам. |
4 | LinkedList Реализует связанный список, расширяя AbstractSequentialList. |
5 | ArrayList Реализует динамический массив, расширяя AbstractList |
6 | AbstractSet Расширяет AbstractCollection и реализует большую часть интерфейса Set. |
7 | HashSet Расширяет AbstractSet для использования в хэш-таблице |
8 | LinkedHashSet Расширяет HashSet, чтобы разрешить итерации порядка вставки. |
9 | TreeSet Реализует набор, хранящийся в дереве. Расширяет AbstractSet. |
10 | AbstractMap Реализует большую часть интерфейса Map. |
11 | HashMap Расширяет AbstractMap для использования хэш-таблицы |
12 | TreeMap Расширяет AbstractMap для использования дерева. |
13 | WeakHashMap Расширяет AbstractMap для использования хеш-таблицы со слабыми ключами. |
14 | LinkedHashMap Расширяет HashMap, чтобы разрешить итерации порядка вставки. |
15 | IdentityHashMap Расширяет AbstractMap и использует равенство ссылок при сравнении документов. |
Классы AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList и AbstractMap предоставляют скелетные реализации интерфейсов основной коллекции в Java, чтобы свести к минимуму усилия, необходимые для их реализации.
Следующие устаревшие классы, определённые java.util, обсуждались в предыдущей главе:
№ | Класс и описание |
1 | Vector Реализует динамический массив. Схож с ArrayList, но с некоторыми отличиями. |
2 | Stack Stack – это подкласс Vector, который реализует стандартный стэк «последним пришёл – первым ушёл». |
3 | Dictionary Dictionary – это абстрактный класс, который представляет собой хранилище ключей/значений и работает так же, как и Map. |
4 | Hashtable Hashtable был частью оригинального java.util и является конкретной реализацией Dictionary. |
5 | Properties Properties – это подкласс Hashtable. Он используется для хранения списков значений, в которых ключ является строкой, и значение тоже является строкой. |
6 | BitSet Класс BitSet создает специальный тип массива, который содержит значения бит. Этот массив может увеличиваться в размерах при необходимости. |
Алгоритмы Collection
Структура коллекций определяет несколько алгоритмов, которые могут применяться к коллекциям и картам. Эти алгоритмы определяются как статические методы в классе Collections.
Некоторые из методов могут генерировать ClassCastException, которое возникает при попытке сравнить несовместимые типы или UnsupportedOperationException, которое возникает, когда предпринимается попытка изменить немодифицируемую коллекцию.
Коллекции определяют три статические переменные: EMPTY_SET, EMPTY_LIST и EMPTY_MAP. Все неизменны.
№ | Алгоритм и описание |
1 | Алгоритмы Collection Вот список всех реализаций алгоритма. |
Как использовать итератор коллекции в Java?
Вы будете часто хотеть циклически перемещаться по элементам в коллекции. Например, вы захотите отобразить каждый элемент.
Легчайший способ это сделать – использовать итератор, который является объектом, который реализует интерфейс Iterator или ListIterator.
Iterator позволяет вам перемещаться по коллекции, получать или удалять элементы. ListIterator расширяет Iterator, чтобы обеспечить двунаправленный обход списка и модификацию элементов.
№ | Метод Iterator и описание |
1 | Использование Iterator в Java Вот список всех методов с примерами, предоставляемыми интерфейсами Iterator и ListIterator. |
Как использовать компаратор?
И TreeSet, и TreeMap хранят элементы в отсортированном порядке. Однако, именно компаратор определяет, что такое отсортированный порядок.
Этот интерфейс позволяет нам сортировать данную коллекцию любым количеством различных способов. Также этот интерфейс может использоваться для сортировки любых экземпляров любого класса (даже классов, которые мы не можем изменить).
№ | Метод Comparator и описание |
1 | Использование Comparator в Java Вот список всех методов с примерами, предоставляемыми интерфейсом Comparator. |
Итог
Структура коллекций Java даёт программисту доступ к предварительно упакованным структурам данных, а также к алгоритмам для их управления.
Коллекция – это объект, который может содержать ссылки на другие объекты. Интерфейсы коллекции объявляют операции, которые могут выполняться для каждого типа коллекции.
Классы и интерфейсы структуры коллекций находятся в java.util.
Оглавление
- 1. Java – Самоучитель для начинающих
- 2. Java – Обзор языка
- 3. Java – Установка и настройка
- 4. Java – Синтаксис
- 5. Java – Классы и объекты
- 6. Java – Конструкторы
- 7. Java – Типы данных и литералы
- 8. Java – Типы переменных
- 9. Java – Модификаторы
- 10. Java – Операторы
- 11. Java – Циклы и операторы цикла
- 11.1. Java – Цикл while
- 11.2. Java – Цикл for
- 11.3. Java – Улучшенный цикл for
- 11.4. Java – Цикл do..while
- 11.5. Java – Оператор break
- 11.6. Java – Оператор continue
- 12. Java – Операторы принятия решений
- 12.1. Java – Оператор if
- 12.2. Java – Оператор if..else
- 12.3. Java – Вложенный оператор if
- 12.4. Java – Оператор switch..case
- 12.5. Java – Условный оператор (? :)
- 13. Java – Числа
- 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
- 13.2. Java – Метод compareTo()
- 13.3. Java – Метод equals()
- 13.4. Java – Метод valueOf()
- 13.5. Java – Метод toString()
- 13.6. Java – Метод parseInt()
- 13.7. Java – Метод Math.abs()
- 13.8. Java – Метод Math.ceil()
- 13.9. Java – Метод Math.floor()
- 13.10. Java – Метод Math.rint()
- 13.11. Java – Метод Math.round()
- 13.12. Java – Метод Math.min()
- 13.13. Java – Метод Math.max()
- 13.14. Java – Метод Math.exp()
- 13.15. Java – Метод Math.log()
- 13.16. Java – Метод Math.pow()
- 13.17. Java – Метод Math.sqrt()
- 13.18. Java – Метод Math.sin()
- 13.19. Java – Метод Math.cos()
- 13.20. Java – Метод Math.tan()
- 13.21. Java – Метод Math.asin()
- 13.22. Java – Метод Math.acos()
- 13.23. Java – Метод Math.atan()
- 13.24. Java – Метод Math.atan2()
- 13.25. Java – Метод Math.toDegrees()
- 13.26. Java – Метод Math.toRadians()
- 13.27. Java – Метод Math.random()
- 14. Java – Символы
- 14.1. Java – Метод Character.isLetter()
- 14.2. Java – Метод Character.isDigit()
- 14.3. Java – Метод Character.isWhitespace()
- 14.4. Java – Метод Character.isUpperCase()
- 14.5. Java – Метод Character.isLowerCase()
- 14.6. Java – Метод Character.toUpperCase()
- 14.7. Java – Метод Character.toLowerCase()
- 14.8. Java – Метод Character.toString()
- 15. Java – Строки
- 15.1. Java – Метод charAt()
- 15.2. Java – Метод compareTo()
- 15.3. Java – Метод compareToIgnoreCase()
- 15.4. Java – Метод concat()
- 15.5. Java – Метод contentEquals()
- 15.6. Java – Метод copyValueOf()
- 15.7. Java – Метод endsWith()
- 15.8. Java – Метод equals()
- 15.9. Java – Метод equalsIgnoreCase()
- 15.10. Java – Метод getBytes()
- 15.11. Java – Метод getChars()
- 15.12. Java – Метод hashCode()
- 15.13. Java – Метод indexOf()
- 15.14. Java – Метод intern()
- 15.15. Java – Метод lastIndexOf()
- 15.16. Java – Метод length()
- 15.17. Java – Метод matches()
- 15.18. Java – Метод regionMatches()
- 15.19. Java – Метод replace()
- 15.20. Java – Метод replaceAll()
- 15.21. Java – Метод replaceFirst()
- 15.22. Java – Метод split()
- 15.23. Java – Метод startsWith()
- 15.24. Java – Метод subSequence()
- 15.25. Java – Метод substring()
- 15.26. Java – Метод toCharArray()
- 15.27. Java – Метод toLowerCase()
- 15.28. Java – Метод toString()
- 15.29. Java – Метод toUpperCase()
- 15.30. Java – Метод trim()
- 15.31. Java – Метод valueOf()
- 15.32. Java – Классы StringBuilder и StringBuffer
- 15.32.1. Java – Метод append()
- 15.32.2. Java – Метод reverse()
- 15.32.3. Java – Метод delete()
- 15.32.4. Java – Метод insert()
- 15.32.5. Java – Метод replace()
- 16. Java – Массивы
- 17. Java – Дата и время
- 18. Java – Регулярные выражения
- 19. Java – Методы
- 20. Java – Потоки ввода/вывода, файлы и каталоги
- 20.1. Java – Класс ByteArrayInputStream
- 20.2. Java – Класс DataInputStream
- 20.3. Java – Класс ByteArrayOutputStream
- 20.4. Java – Класс DataOutputStream
- 20.5. Java – Класс File
- 20.6. Java – Класс FileReader
- 20.7. Java – Класс FileWriter
- 21. Java – Исключения
- 21.1. Java – Встроенные исключения
- 22. Java – Вложенные и внутренние классы
- 23. Java – Наследование
- 24. Java – Переопределение
- 25. Java – Полиморфизм
- 26. Java – Абстракция
- 27. Java – Инкапсуляция
- 28. Java – Интерфейсы
- 29. Java – Пакеты
- 30. Java – Структуры данных
- 30.1. Java – Интерфейс Enumeration
- 30.2. Java – Класс BitSet
- 30.3. Java – Класс Vector
- 30.4. Java – Класс Stack
- 30.5. Java – Класс Dictionary
- 30.6. Java – Класс Hashtable
- 30.7. Java – Класс Properties
- 31. Java – Коллекции
- 31.1. Java – Интерфейс Collection
- 31.2. Java – Интерфейс List
- 31.3. Java – Интерфейс Set
- 31.4. Java – Интерфейс SortedSet
- 31.5. Java – Интерфейс Map
- 31.6. Java – Интерфейс Map.Entry
- 31.7. Java – Интерфейс SortedMap
- 31.8. Java – Класс LinkedList
- 31.9. Java – Класс ArrayList
- 31.10. Java – Класс HashSet
- 31.11. Java – Класс LinkedHashSet
- 31.12. Java – Класс TreeSet
- 31.13. Java – Класс HashMap
- 31.14. Java – Класс TreeMap
- 31.15. Java – Класс WeakHashMap
- 31.16. Java – Класс LinkedHashMap
- 31.17. Java – Класс IdentityHashMap
- 31.18. Java – Алгоритмы Collection
- 31.19. Java – Iterator и ListIterator
- 31.20. Java – Comparator
- 32. Java – Дженерики
- 33. Java – Сериализация
- 34. Java – Сеть
- 34.1. Java – Обработка URL
- 35. Java – Отправка Email
- 36. Java – Многопоточность
- 36.1. Java – Синхронизация потоков
- 36.2. Java – Межпоточная связь
- 36.3. Java – Взаимная блокировка потоков
- 36.4. Java – Управление потоками
- 37. Java – Основы работы с апплетами
- 38. Java – Javadoc