API API Collection Java предоставляет несколько классов столбцов и интерфейсов, чтобы помочь нам хранить и управлять коллекциями объектов. Фактически, коллекции в Java работают как массив, но размер коллекции может быть изменен динамически, а коллекции также обеспечивают более продвинутые функции. С помощью Javacollection API нам не нужно сами писать классы сбора. Большинство классов коллекций Java расположены в пакете java.util , а некоторые классы коллекций, связанные с параллелизмом, расположены в пакете java.util.concurrent . Вот некоторые из классов сбора, предоставленных Java API.
1. Обзор коллекций Java
В Java есть две категории коллекций, а именно:
1. Коллекция
2. Карта
Коллекцию класса коллекции можно понимать как в основном хранение отдельных объектов, в то время как коллекция класса карт в основном хранит объекты ключей. Эти две категории могут быть восприняты как должное, чтобы соответствовать двум интерфейсам, а именно Collection接口и Map接口. На следующем изображении перечислено дерево наследования этих двух интерфейсов:
На приведенной выше картинке мы видим, что интерфейс коллекции получил три ветви, а именно:
1. Список
2. set
3. очередь
Карта относительно проста, только с одной ветвью. Ниже мы подробно расскажем о каждом классе реализации коллекции Java.
Примечание. Чтобы отличить сбор и коллекции, коллекции являются интерфейсом для сбора, а коллекции - это класс инструментов, который предоставляет некоторые статические методы, которые способствуют нам управлять экземплярами сбора, оба из которых расположены в пакете java.util .
2. Сначала представьте интерфейс коллекции
Следующий рисунок представляет собой скриншот исходного кода интерфейса коллекции. Из абстрактных методов в интерфейсе мы видим, что он определяет общий метод для общего сбора:
- Добавить и удалить элемент
- определить, существует ли элемент
- Получите размер коллекции
- Итерация над коллекцией
2.1 Интерфейс списка коллекции
Интерфейс списка наследует от интерфейса коллекции. Его характеристика заключается в том, что объекты в нем упорядочены, и каждый объект имеет уникальный индекс. Мы можем искать элемент через этот индекс, и объекты в списке разрешены повторять, что похоже на массив. Для интерфейса списка Java API предоставляет следующую реализацию:
- java.util.arraylist
- java.util.linkedlist
- java.util.vector
- java.util.stack
Конечно, есть некоторые реализации в пакете java.util.concurrent , который будет подробно описан в другой статье.
ArrayList является наиболее часто используемой коллекцией, и его внутренняя реализация является массивом , а размер ArrayList может быть динамически расширен. Эффективность случайного доступа для элементов высока, а временная сложность доступа - O(1) . Эффективность работы от хвоста высока, а временная сложность O(1) как и случайный доступ. Если он работает от головы, эффективность будет относительно низкой, потому что при вставке или удалении из головы все следующие элементы должны быть перемещены, а временная сложность - O(ni) (n представляет количество элементов, а я представляет позицию элемента).
Linklist: Как видно из приведенного выше рисунка, он не только наследует интерфейс List , но и наследует интерфейс Deque (он будет представлен позже). Linklist - это структура данных, основанная на связанном списке, и каждый узел сохраняет указатели на предыдущие и следующие узлы. Linklist относительно неэффективен для случайного доступа, потому что он требует индексации с нуля, поэтому его временная сложность - O(i) . Однако для добавления и удаления элементов Linklist эффективен, потому что необходимо изменить только передние и задние указатели, а его сложность - O(1) .
Вектор: На скриншотах вектора и исходного кода ArrayList они наследуют интерфейсы точно одинаково. Следовательно, вектор может рассматриваться как защитный список, который также реализован на основе массивов , но почти все операции сбора добавляются с помощью synchronized ключевого слова.
Стек: вышеупомянутый скриншот исходного кода класса стека. Мы видим, что класс стека на самом деле наследует от вектора. Stack просто добавляет несколько методов, основанных на векторе, чтобы обеспечить характеристики стека (последний в первом выходе). Особенность Stack заключается в том, что при добавлении новые элементы будут добавлены в верхнюю часть, а при удалении верхние элементы будут сняты первыми. Эта структура данных в основном используется в качестве некоторых специальных процессов обработки данных, таких как языковая компиляция, анализ XML и т. Д.
2.2 Интерфейс набора коллекций
Интерфейсы SET и LIST также унаследованы от интерфейса Collection , а также являются реализацией коллекций. Самая большая разница между ними заключается в том, что объекты в наборе не позволяют повторять . Для Set интерфейсов Java API предоставляет следующую реализацию:
- java.util.enumset
- java.util.hashset
- java.util.linkedhashset
- java.util.treeset
Функции этих классов немного отличаются, и различия в основном отражаются в порядке итерации объектов и эффективности вставки и поиска.
Реализация Hashset очень проста, и это HashMap внутри, но она не гарантирует порядок элементов.
Реализация LinkedHashset также очень проста, и она использует LinkedHashMap внутри. Поскольку LinkedHashMap поддерживает двунаправленный список связанного списка для поддержания порядка, характеристикой LinkedHashSet является то, что элементы в нем упорядочены, а порядок итерации элемента является порядок их вставки. Повторение элементов не повлияет на порядок первоначальных элементов.
Treesset: из -за отношения наследования на рисунке выше вы должны сначала понять интерфейсы NavigableSet TreeSet SortedSet .
Интерфейс SortedSet
Общедоступный интерфейс SortedSet <e> extends set <e> {Comporator <? Super E> Comporator (); SortedSet <e> Подмножество (E от Element, E -элемент); SortedSet <e> Гарнитура (e toelement); SortedSet <e> Хвост (e fromElement); E First (); } Из приведенного выше определения интерфейса интерфейс SortedSet является поднтерфейсом набора. В дополнение к общим наборным характеристикам его элементы заказаны внутри. Порядок внутренних элементов зависит от правил упорядочения элементов, то есть порядок элементов зависит от реализации comparable интерфейса элемента или comparator компаратора. Для разницы между сопоставимым и компаратором, пожалуйста, см.
Invigablesset Interface
Общедоступный интерфейс NavigableSet <e> extends sortedset <e> {vaigablesset <e> descendingset (); Итератор <e> gancenditerator (); SortedSet <e> Гарнитура (e toelement); SortedSet <e> Хвост (e fromElement); SortedSet <e> Подмножество (E от Element, E -элемент); потолок (), пол (), выше () и ниже () ...}Из определения интерфейса навигабет, он является поднтерфейсом SortedSet и предоставляет некоторые методы навигации. Что касается значения этих методов навигации, вы можете проверить Java Doc.
Следовательно, характеристика TreesSet заключается в том, что его внутренние элементы упорядочены, и существует много методов навигации для реализации. Из первой части обзора класса коллекции Java мы знаем, что SET имеет подвластный SortedSet , а SortedSet имеет интерфейс Sub-Interface NavigableSet . Java API только реализует интерфейсы SortedSet и HavigabablesSet, которые являются TreeSet .
2.3 Интерфейс очереди коллекции
Интерфейс очереди наследует от интерфейса Collection , который также представляет упорядоченную очередь. Тем не менее, самая большая особенность этой очереди заключается в том, что недавно вставленный элемент расположен на хвосте очереди, а снятый объект расположен в голове очереди, которая похожа на очередь, которая проверяется в супермаркете.
Мы уже знаем из обзора коллекции Java в разделе 1, что интерфейс очереди также имеет подключенную Deque. Давайте посмотрим на определение этих двух интерфейсов Java API:
Интерфейс очереди:
Общедоступная очередь интерфейса <e> Extends Collection <e> {boolean add (e e); логическое предложение (E E); E удалить (); E опрос (); E peek ();}Интерфейс deque:
публичный интерфейс deque <e> extends queue <e> {void addfirst (e e); void Addlast (E E); E removefirst (); E removefirst ();}Из определений этих двух интерфейсов я думаю, что все видели некоторые подсказки. Интерфейс очереди определяет метод работы общей очереди, в то время как Deque является двойной очередью .
Для интерфейсов Queue Java API предоставляет две реализации:
- java.util.linkedlist (также реализует интерфейс deque)
- java.util.priorityqueue
LinkedList: предыдущая глава списка упомянула, что это стандартная очередь.
Приоритет: порядок в очереди аналогичен деревьям, в зависимости от правил упорядочения элементов, то есть реализации элементов к сопоставимому интерфейсу или компаратору компаратора.
Для интерфейса Deque есть еще одна реализация, помимо класса Linklist:
- java.util.arraydeque
Arraydeque: Как видно из имени, его внутренняя реализация является массивом.
3. Карта коллекции Java
Из первой части обзора класса Java Collection мы знаем, что карта не наследует от интерфейса коллекции, но расположена в параллельной позиции с интерфейсом коллекции. Следовательно, поведение карты сильно отличается от поведения сбора, представленного выше. Основной особенностью карты является то, что элементы, которые он хранит, являются парами key-value . Давайте посмотрим на определение интерфейса карты:
Карта публичного интерфейса <K, v> {v put (k key, v value); логический содержит (объектный ключ); SET <Map.Entry <K, v >> intrySet (); int hashcode (); V get (объектный ключ); Set <k> keyset (); ...}Для интерфейсов карты Java API предоставляет следующие реализации:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- java.util.identityhashmap
- java.util.linkedhashmap
- java.util.properties
- java.util.treemap
- java.util.weakhashmap
Среди них наиболее часто используются Hashmap и Treeemap.
Ключ и значение в HashMap оба беспорядочны. Внутренняя реализация HashMap стоит изучить. Для получения подробной информации, пожалуйста, обратитесь к внутренней реализации HashMap
Hashtable можно рассматривать как внедрение HashMap. Большинство методов добавляются с помощью синхронизированного ключевого слова, которое безопасно. Другое различие между HashTable и хэшмапом заключается в том, что оба key-value HashMap могут быть нулевыми, в то время как HashTable不.
LinkedHashmap также является хэшмапом, но внутренне поддерживается двусторонний список, чтобы поддерживать порядок. Внутренняя реализация LinkedHashSet используется для использования LinkedHashmap.
Ключ и ценность в TreeMap могут не только поддерживать порядок, но и аналогичны TreeSet и PriorityQueue . Итеративный порядок ключа и ценности в TreeMap зависит от их соответствующих правил сортировки.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.