Реализуйте различные структуры данных с помощью Java
Коллекции используются на всех языках программирования. Это объекты, которые объединяют несколько элементов в единое целое. До использования фреймворка Коллекции программистам было сложно писать алгоритмы, которые работали бы для разных типов коллекций. В Java были некоторые классы Collection, такие как Vector
, Stack
, Hashtable
и Array
, но у них были свои недостатки.
В JDK 1.2 разработчики Java представили платформу Collections, которая является важной средой, помогающей выполнять все операции с данными. Сегодня мы более подробно рассмотрим этот фреймворк и некоторые его компоненты.
Вот что мы рассмотрим сегодня:
- Что такое коллекции Java?
ArrayList
в JavaLinkedList
в JavaHashSet
в JavaTreeSet
в Java- Другие коллекции для изучения
Что такое коллекции Java?
Согласно документации, среда Java Collections - это унифицированная архитектура для представления коллекций и управления ими. Он содержит интерфейсы, классы их реализации и алгоритмы для обработки данных, хранящихся в коллекции. Интерфейс Collection
расширен другими интерфейсами, такими как List
, Set
и Queue
.
Примечание. Существует также Map
интерфейс, но он не реализует Collection
интерфейс, поскольку хранит пары ключ-значение, а классы, входящие в интерфейс Collection, хранят только значения.
Различия между платформой коллекций и коллекциями
- Фреймворк коллекций - это интерфейс, а
Collections
- это класс. - Интерфейс
Collection
предоставляет стандартные функции структур данных дляList
,Set
иQueue
. КлассCollections
предоставляет стандартные методы, которые можно использовать для поиска, сортировки и координации элементов коллекции. Collections
- это объекты, которые представляют группу объектов (например,Vector
), а структура коллекций может представлять коллекции и управлять ими.
Компоненты Java Collections Framework
Интерфейсы
Эти интерфейсы предоставляют абстрактный тип данных для представления коллекции. java.util.Collection
- это корневой интерфейс фреймворка. Он находится на вершине иерархии фреймворка и содержит важные методы, такие как size()
, iterator()
, add()
, remove()
и clear()
.
Интерфейс Iterable
- это корень всей структуры коллекции. Это позволяет итератору перебирать все коллекции. Все классы и интерфейсы используют этот интерфейс. Интерфейс Collection
расширяет итеративный интерфейс и выполняется классами в структуре коллекции. Интерфейс List
запрещает структуру данных типа списка, в которой мы можем хранить упорядоченные коллекции объектов.
Некоторые более важные интерфейсы включают в себя:
Map
интерфейс:java.util.Map
Set
интерфейс:java.util.Set
Deque
интерфейс:java.util.Deque
Примечание. Map
- единственный интерфейс, который не наследуется от интерфейса Collection
, но включен в структуру коллекций. Все интерфейсы фреймворка находятся в пакете java.util
.
Классы реализации
Фреймворк предоставляет классы реализации для коллекций. Вы можете использовать их для создания различных типов коллекций в ваших программах Java. Некоторые из основных классов коллекций включают:
ArrayList
LinkedList
PriorityQueue
HashMap
иHashSet
TreeMap
иTreeSet
Алгоритмы
Эти алгоритмы выполняют важные функции с коллекциями, например списки сортировки.
Иерархия фреймворка Collections выглядит следующим образом:
ArrayList в Java
ArrayList
- наиболее часто используемая реализация интерфейса List
. Некоторые из его функций включают:
- Сохраняет элементы в порядке вставки.
- Позволяет хранить повторяющиеся элементы.
- Поддерживает
null
элементов.
ArrayList
хранит данные в массиве с изменяемым размером. Когда вы создаете ArrayList
, вы создаете массив нулевого размера. Когда вставляется первый элемент, размер массива изменяется до десяти. Это известно как отложенная инициализация, и при этом сохраняется много памяти. Перед добавлением элемента в ArrayList
проверяется емкость. Если массив заполнен, создается новый массив размером (n + n / 2 + 1). Затем элементы из старого массива копируются в новый.
Создать ArrayList
в Java можно тремя способами:
- Конструктор
no-arg
- этот конструктор не принимает никаких аргументов и создает нулевой размер списка.
List list = newArrayList();
2. Конструктор, который принимает начальную емкость - вы можете указать начальную емкость при создании ArrayList
. Допустим, вы знаете, что ваш ArrayList
будет содержать не менее 50 элементов. Вы можете создать свой ArrayList
размером 50, уменьшив необходимость постоянного изменения размера.
List list = newArrayList(50);
3. Существующий Collection
- вы можете создать ArrayList
, используя существующий Collection
, и список будет содержать все элементы исходного Collection
в том же порядке.
List list = newArrayList(oldList);
Вот пример ArrayList
, который можно выполнить на Java:
Выход:
[1, 2, 3] The element at index two is 2 The size of the List is 3
С ArrayList
можно делать много вещей, в том числе:
- Обновите элемент, используя метод
set(int index, E e)
. - Проверьте, присутствует ли элемент, используя метод
contains(Object o)
. - Удалите все элементы в пределах заданного
Collection
, используя методremoveAll(Collection<?> c)
. - Замените все элементы, используя
replaceAll(UnaryOperator<E> operator)
. - И т.п.
LinkedList в Java
Класс LinkedList
реализует интерфейсы List
и Deque
. Некоторые из его функций включают:
- Сохраняет элементы в порядке вставки.
- Поддерживает повторяющиеся элементы.
- Допускает любое количество
null
элементов.
LinkedList
также имеет статический внутренний класс Node
, который содержит три поля:
item
- содержит значение текущего элементаnext
- содержит указатель на следующий элементprev
- содержит указатель на предыдущий элемент
Когда элемент добавляется в LinkedList
, он создает новый экземпляр Node
. Поля prev
и next
устанавливаются в зависимости от того, где добавлен новый узел.
Есть два способа создать LinkedList
на Java:
- Конструктор
no-arg
- этот конструктор не принимает никаких аргументов и создает список с нулевым размером.
List<Integer> list = new LinkedList<Integer>();
2. Существующий Collection
- вы можете создать LinkedList
, используя существующий Collection
, и список будет содержать все элементы исходного Collection
в том же порядке.
List<Integer> list = new LinkedList<Integer>(oldList);
Вот пример LinkedList
, который можно выполнить на Java:
Выход:
[1, 2, 3] [10, 1, 2, 3] [10, 1, 20, 2, 3] [10, 1, 20, 101, 102, 103, 2, 3]
Еще несколько вещей, которые вы можете сделать с LinkedList
:
- Получить элемент по определенному индексу с помощью метода
get(int index)
. - Удалите последний элемент, используя метод
removeLast()
. - Отсортируйте
LinkedList
, используя методsort()
. - И т.п.
HashSet в Java
HashSet
- это класс в java.util
пакете, реализующий интерфейс Set
. Некоторые особенности HashSet
включают:
- Не допускает дублирования элементов.
- Допускается только один
null
элемент. - Элементы вставляются в случайном порядке.
- Внутренняя поддержка
HashMap
.
Есть четыре способа создать HashSet в Java:
- Конструктор
no-arg
- создастHashSet
с начальной емкостью 16 и коэффициентом загрузки 0,75.
Set<Integer> set = new HashSet<>();
2. Конструктор, который принимает начальную емкость. Если вы знаете, что ваш HashSet
будет иметь более 16 элементов, вы можете установить более высокую начальную емкость, чтобы уменьшить необходимость изменения размера. Он будет использовать коэффициент загрузки по умолчанию 0,75.
3. Конструктор, который принимает начальную емкость и коэффициент нагрузки. Вы также можете указать начальный коэффициент нагрузки вместе с начальной емкостью.
4. Конструктор, который принимает другой Set
в качестве параметра. Вы можете создать HashSet
, используя другой Set
, передав его конструктору. Он будет иметь тот же размер, что и переданный набор, и коэффициент загрузки по умолчанию 0,75.
Вот пример HashSet
, который можно выполнить на Java:
Выход:
Inserting 17 in the HashSet: true Inserting 34 in the HashSet: true Inserting 17 in the HashSet: false [17, 34]
В приведенном выше коде показана демонстрация метода add(E e)
, который вставляет элемент в HashSet
. Если вставленного элемента еще не было в HashSet
, метод вернул true
. Если элемент уже был в HashSet
, метод вернул false
.
С HashSets
вы можете делать больше, например:
- Удалите элементы с помощью метода
remove(Object o)
. - Проверьте, пуст ли
HashSet
, используя методisEmpty()
. - Получить элемент из
HashSet
с помощью методаcontains()
. - И т.п.
TreeSet в Java
Класс TreeSet
реализует интерфейс Set
, который использует дерево для хранения. Некоторые из функций включают:
- Не допускает дублирования элементов.
- Не допускает
null
элементов. - Быстрый доступ и время поиска.
- Элементы хранятся в порядке возрастания.
Иерархия TreeSet
выглядит следующим образом:
Чем TreeSet
отличается от HashSet
?
• HashSet
допускает один нулевой элемент, а TreeSet
не допускает никаких.
• Элементы сортируются случайным образом в HashSet
, а в TreeSet
они сортируются по порядку.
• HashSet
быстрее для таких операций, как add
, remove
, contains
, size
и т. Д.
Есть четыре способа создать TreeSet в Java:
- Конструктор
no-arg
.
Set<Integer> set = new TreeSet<>();
2. Конструктор с Comparator
в качестве аргумента. Если объекты, которые вы храните в своем TreeSet
, не реализуют Comparator
интерфейс или если вам нужно хранить элементы в порядке убывания, вы можете указать собственный Comparator
при создании TreeSet
. Это отсортирует элементы в соответствии с логикой Comparator
.
3. Конструктор с аргументом типа Collection
- вы можете создать TreeSet
из другого Collection
. Элементы будут храниться в порядке возрастания.
4. Конструктор с аргументом типа SortedSet
- этот конструктор действует как конструктор копирования и создает новый отсортированный набор с теми же элементами и тем же порядком, что и предоставленный отсортированный набор.
Вот пример TreeSet
, который можно выполнить на Java:
Выход:
TreeSet elements in ascending order [11, 21, 32, 44, 54] TreeSet elements in descending order [54, 44, 32, 21, 11]
С TreeSet
можно делать и другие вещи, например:
- Получить элементы, превышающие данный элемент, используя метод
tailSet(E fromElement)
. - Получите подмножество элементов с помощью метода
subSet(E fromElement, E to Element)
. - И т.п.
Другие коллекции для изучения
Поздравляем с вашими первыми шагами в работе с фреймворком Java Collections! Collection
- одна из самых важных тем в программировании на Java, и эта важная структура поможет вам выполнять все ваши операции с данными.
Теперь вы готовы глубже погрузиться в структуру Java Collections и узнать больше о таких темах, как:
LinkedHashMap
иLinkedHashSet
SortedMap
иSortedSet
toArray()
hasNext()
- И т.п.
Удачного обучения!