Платформа коллекций Java
Платформа Java коллекций представляет собой набор классов и интерфейсов коллекций , которые реализуют часто используемые повторно используемые структуры данных . [1]
Хотя его называют фреймворком , он работает по принципу библиотеки . Платформа коллекций предоставляет как интерфейсы, определяющие различные коллекции, так и классы, их реализующие.
Отличия от массивов
[ редактировать ]Collection
И массивы схожи в том, что они оба содержат ссылки на объекты и ими можно управлять как группой. Однако, в отличие от массивов, Collection
s не нужно назначать определенную емкость при создании экземпляра. Collection
s может автоматически увеличиваться и уменьшаться в размерах при добавлении или удалении объектов.
Collection
s не может содержать примитивные типы данных, такие как int
, long
, или double
. [2] Вместо, Collection
s может содержать классы-оболочки, такие как java.lang.Integer
, java.lang.Long
, или java.lang.Double
. [3]
Collection
s являются общими и, следовательно, инвариантными, но массивы ковариантны . Это можно считать преимуществом универсальных объектов, таких как Collection
по сравнению с массивами, потому что при определенных обстоятельствах использование общего Collection
вместо массива предотвращает исключения во время выполнения, вместо этого выдавая исключение во время компиляции, чтобы сообщить разработчику о необходимости исправить код. Например, если разработчик объявляет Object[]
объект и назначает Object[]
объект к значению, возвращаемому новым Long[]
экземпляр с определенной емкостью, исключение во время компиляции не будет выдано. Если разработчик попытается добавить String
к этому Long[]
объект, Java-программа выдаст ArrayStoreException
. С другой стороны, если разработчик вместо этого объявил новый экземпляр Collection<Object>
как ArrayList<Long>
, компилятор Java (правильно) выдаст исключение во время компиляции, чтобы указать, что код написан с несовместимым и неправильным типом, тем самым предотвращая любые потенциальные исключения во время выполнения. Разработчик может исправить код, создав экземпляр Collection<Object>
как ArrayList<Object>
объект. Если в коде используется Java SE7 или более поздние версии, разработчик может создать Collection<Object>
как ArrayList<>
объект с помощью оператора ромба [2]
Collection
s являются универсальными и, следовательно, реифицированы , но массивы не реифицированы. [2]
История
[ редактировать ]Collection
Реализации в до JDK 1.2 включали несколько классов структур данных, но не содержали структуру коллекций. версиях платформы Java [4] Стандартные методы группировки объектов Java заключались в использовании массива, Vector
и Hashtable
классы, которые, к сожалению, было нелегко расширить и которые не реализовали стандартный интерфейс-член. [5] [ нужен лучший источник ]
Чтобы удовлетворить потребность в структурах данных коллекции многократного использования , было разработано несколько независимых платформ: [4] наиболее часто используемым является Дуга Ли » пакет «Коллекции , [6] и ObjectSpace библиотека общих коллекций (JGL), [7] основной целью которого было согласование со C++ стандартной библиотекой шаблонов (STL). [8] [ нужен лучший источник ]
Структура коллекций была спроектирована и разработана главным образом Джошуа Блохом и была представлена в JDK 1.2 . Он повторно использовал многие идеи и классы из пакета Doug Lea Collections , который в результате был признан устаревшим. [6] Компания Sun Microsystems решила не использовать идеи JGL, поскольку им нужна была компактная структура, а согласованность с C++ не была одной из их целей. [9] [ нужен лучший источник ]
Позже Дуг Ли разработал параллелизма пакет , включающий новые классы, связанные с коллекциями. [10] Обновленная версия этих утилит параллелизма была включена в JDK 5.0 начиная с JSR 166 .
Архитектура
[ редактировать ]Почти все коллекции в Java являются производными от java.util.Collection
интерфейс. Collection
определяет основные части всех коллекций.
Интерфейс имеет add(E e)
и remove(E e)
методы добавления и удаления из Collection
соответственно. Он также имеет toArray()
метод, который преобразует Collection
в массив Object
в Collection
(с типом возврата Object[]
). [11] Наконец, contains(E e)
метод проверяет, существует ли указанный элемент в Collection
.
The Collection
интерфейс является субинтерфейсом java.lang.Iterable
, так что любой Collection
может быть целью оператора for-each . ( Iterable
интерфейс обеспечивает iterator()
метод, используемый операторами for-each.) Все Collection
у нас есть java.util.Iterator
который проходит через все элементы в Collection
.
Collection
является общим. Любой Collection
может хранить любые Object
. Например, любая реализация Collection<String>
содержит String
объекты. При использовании литья не требуется. String
объекты из реализации Collection<String>
. [12] Обратите внимание, что угловые скобки < >
может содержать аргумент типа, который указывает, какой тип Collection
держит. [13]
Виды сбора
[ редактировать ]Существует несколько универсальных типов Collection
: Очереди , карты , списки и наборы .
Очереди позволяют программисту вставлять элементы в определенном порядке и извлекать эти элементы в том же порядке. Примером является список ожидания. Базовые интерфейсы для очередей называются Queue
.
Словари/Карты хранят ссылки на объекты с ключом поиска для доступа к значениям объекта. Одним из примеров ключа является удостоверение личности. Базовый интерфейс словарей/карт называется Map
.
Списки — это конечные коллекции, в которых одно и то же значение может храниться несколько раз.
Наборы — это неупорядоченные коллекции, которые можно повторять и которые содержат каждый элемент не более одного раза. Базовый интерфейс для наборов называется Set
. [3]
Интерфейс списка
[ редактировать ]Списки реализуются в рамках коллекций через java.util.List
интерфейс. Он определяет список как более гибкую версию массива. Элементы имеют определенный порядок, и допускаются дублирующиеся элементы. Элементы можно размещать в определенном положении. Их также можно искать в списке.
Получение списка реализаций
[ редактировать ]Существует несколько конкретных классов, которые реализуют List
, включая AbstractList
и все его соответствующие подклассы, а также CopyOnWriteArrayList
.
Класс AbstractList
[ редактировать ]Прямые подклассы AbstractList
класс включает AbstractSequentialList
, ArrayList
и Vector
.
AbstractList
— это пример скелетной реализации , которая использует и сочетает в себе преимущества интерфейсов и абстрактных классов, упрощая разработчику разработку собственной реализации для данного интерфейса. [14]
Класс ArrayList
[ редактировать ]The java.util.ArrayList
класс реализует List
как массив. Всякий раз, когда функции, специфичные для List
необходимы, класс перемещает элементы внутри массива, чтобы сделать это.
Класс LinkedList
[ редактировать ]The java.util.LinkedList
класс хранит элементы в узлах, каждый из которых имеет указатель на предыдущий и следующий узлы в List
. List
можно перемещаться, следуя указателям, а элементы можно добавлять или удалять, просто меняя указатели, чтобы разместить узел на нужном месте. [15]
Векторный класс
[ редактировать ]The Vector
класс имеет Stack
как его прямой подкласс. Это пример нарушения принципа композиции над наследованием в библиотеках платформы Java, поскольку в вектор вообще стеком не является . информатике [16] Композиция была бы более подходящей в этом сценарии. [16]
Класс стека
[ редактировать ]Класс стека extends
сорт java.util.Vector
с пятью операциями, которые позволяют Vector
рассматриваться как Stack
.Стеки создаются с помощью java.util.Stack
. Stack
предлагает методы для размещения нового объекта на Stack
(метод push(E e)
) и получать объекты из Stack
(метод pop()
). А Stack
возвращает объект в порядке «последним пришел — первым обслужен» (LIFO), например объект, который был помещен последним на Stack
возвращается первым. java.util.Stack
— это стандартная реализация стека, предоставляемая Java.
The Stack
Класс представляет собой стек объектов по принципу «последним пришел — первым обслужен» (LIFO). Класс Stack имеет пять дополнительных операций, которые позволяют Vector
рассматриваться как Stack
. Обычный push(E e)
и pop()
предоставляются операции, а также метод ( peek()
), чтобы просмотреть верхний элемент на Stack
, метод проверки того, Stack
пусто( empty()
) и метод поиска Stack
для предмета и узнайте, насколько далеко он находится от верха ( search(Object o)
). Когда Stack
создается впервые, он не содержит элементов.
Класс CopyOnWriteArrayList
[ редактировать ]The CopyOnWriteArrayList
расширяет Object
class и не расширяет никакие другие классы. CopyOnWriteArrayList
обеспечивает потокобезопасность без выполнения чрезмерной синхронизации. [17]
В некоторых сценариях синхронизация является обязательной. Например, если метод изменяет статическое поле и этот метод должен вызываться несколькими потоками, то синхронизация является обязательной и используются утилиты параллелизма, такие как CopyOnWriteArrayList
не следует использовать. [17]
Однако синхронизация может привести к снижению производительности. Для сценариев, где синхронизация не является обязательной, CopyOnWriteArrayList
— это жизнеспособная, поточно-безопасная альтернатива синхронизации, которая использует многоядерные процессоры и приводит к более высокой загрузке ЦП . [17]
Интерфейсы очередей
[ редактировать ]The java.util.Queue
Интерфейс определяет структуру данных очереди, в которой элементы хранятся в том порядке, в котором они вставлены. Новые дополнения идут в конец строки, а элементы убираются спереди. Это создает систему «первым пришел — первым ушел» . Этот интерфейс реализован java.util.LinkedList
, java.util.ArrayDeque
, и java.util.PriorityQueue
.
Реализации очередей
[ редактировать ]Класс AbstractQueue
[ редактировать ]Прямые подклассы AbstractQueue
класс включает ArrayBlockingQueue
, ConcurrentLinkedQueue
, DelayeQueue
, LinkedBlockingDeque
, LinkedBlockingQueue
. LinkedTransferQueue
и PriorityBlockingQueue
.
Обратите внимание, что ArrayDeque
и ConcurrentLinkedDeque
оба простираются AbstractCollection
но не расширяйте другие абстрактные классы, такие как AbstractQueue
.
AbstractQueue
является примером скелетной реализации .
Класс PriorityQueue
[ редактировать ]The java.util.PriorityQueue
класс реализует java.util.Queue
, но и изменяет его. [18] PriorityQueue
имеет дополнительный comparator()
метод. [18] Вместо того, чтобы элементы упорядочивались в том порядке, в котором они были вставлены, они упорядочиваются по приоритету. Метод, используемый для определения приоритета, является либо java.lang.Comparable#compareTo(T)
метод в элементах или метод, заданный в конструкторе. Класс создает это, используя кучу для сортировки элементов. [19]
Класс ConcurrentLinkedQueue
[ редактировать ]The java.util.concurrent.ConcurrentLinkedQueue
класс расширяется java.util.AbstractQueue
. ConcurrentLinkedQueue
реализует java.util.Queue
интерфейс. [20]
The ConcurrentLinkedQueue
class является потокобезопасной коллекцией, поскольку для любого элемента, помещенного внутри ConcurrentLinkedQueue
элемента , библиотека коллекций Java гарантирует безопасную публикацию , позволяя любому потоку получить элемент из коллекции. [21] Говорят, что объект опубликован безопасно , если его состояние становится видимым для всех остальных потоков в тот же момент времени. [21] Безопасная публикация обычно требует синхронизации публикующего и потребляющего потоков. [21]
Интерфейс BlockingQueue
[ редактировать ]java.util.concurrent.BlockingQueue
интерфейс расширяется Queue
. [20]
The BlockingQueue
Интерфейс имеет следующие прямые подинтерфейсы: BlockingDeque
и TransferQueue
. BlockingQueue
работает как обычный Queue
но дополнения и удаления из BlockingQueue
блокируют. [22] Если remove(Object o)
вызывается на пустом месте BlockingQueue
, можно настроить ожидание появления элемента в списке либо в течение заданного времени, либо на неопределенный срок. BlockingQueue
. Аналогично, добавление элемента с помощью метода add(Object o)
подлежит дополнительному ограничению пропускной способности на BlockingQueue
, и метод может дождаться освобождения места в BlockingQueue
перед возвращением. BlockingQueue
интерфейс представляет метод take()
который удаляет и получает голову BlockingQueue
и ждет, пока BlockingQueue
больше не пуст, если требуется. [23] [24]
Интерфейсы двусторонней очереди (Deque)
[ редактировать ]The Deque
интерфейсрасширяет Queue
интерфейс. [25] Deque
создает двустороннюю очередь. В то время как регулярный Queue
разрешается вставлять только сзади и извлекать спереди, Deque
позволяет вставлять и удалять как спереди, так и сзади. А Deque
это как Queue
которые можно использовать вперед или назад, или и то, и другое одновременно. Кроме того, можно создать как прямой, так и обратный итератор. Deque
интерфейс реализован java.util.ArrayDeque
и java.util.LinkedList
. [26]
Реализации деков
[ редактировать ]Класс LinkedList
[ редактировать ]LinkedList
, конечно, также реализует List
интерфейс и также может использоваться как один. Но оно также имеет Queue
методы. LinkedList
реализует java.util.Deque
интерфейс, что придает ему большую гибкость. [27]
Класс ArrayDeque
[ редактировать ]ArrayDeque
реализует Queue
как массив. Похоже на: LinkedList
, ArrayDeque
также реализует java.util.Deque
интерфейс. [27]
Интерфейс BlockingDeque
[ редактировать ]The java.util.concurrent.BlockingDeque
интерфейс расширяется java.util.concurrent.BlockingQueue
. [25] BlockingDeque
похоже на BlockingQueue
. Он предоставляет одни и те же методы для вставки и удаления с ограничениями по времени ожидания, пока вставка или удаление станет возможным. Однако интерфейс также обеспечивает гибкость Deque
. Вставки и удаления могут осуществляться с обоих концов. Функция блокировки совмещена с Deque
функция. [28]
Установить интерфейсы
[ редактировать ]Java java.util.Set
интерфейс определяет Set
. А Set
в нем не может быть повторяющихся элементов. Кроме того, Set
не имеет установленного порядка. Таким образом, элементы не могут быть найдены по индексу. Set
реализуется java.util.HashSet
, java.util.LinkedHashSet
, и java.util.TreeSet
.
Установить реализации интерфейса
[ редактировать ]Существует несколько реализаций интерфейса Set, в том числе AbstractSet
и его подклассы, а также последний статический внутренний класс ConcurrentHashMap.KeySetView<K,V>
(где K
и V
являются параметрами формального типа).
АннотацияНабор
[ редактировать ]AbstractSet
представляет собой реализацию скелетную Set
интерфейс. [14]
Прямые подклассы AbstractSet
включать ConcurrentSkipListSet
, CopyOnWriteArraySet
, EnumSet
, HashSet
и TreeSet
.
Класс EnumSet
[ редактировать ]The EnumSet
класс расширяется AbstractSet
. EnumSet
Класс не имеет общедоступных конструкторов и содержит только статические фабричные методы. [29]
EnumSet
содержит статический фабричный метод EnumSet.of()
. [30] Этот метод является методом агрегирования. [29] Он принимает несколько параметров, учитывает тип параметров, а затем возвращает экземпляр соответствующего типа. [29] По состоянию на 2018 год в реализации OpenJDK Java SE8 используются две реализации: EnumSet
которые невидимы для клиента, которые RegularEnumSet
и JumboEnumSet
. [29] Если RegularEnumSet
больше не давал никаких преимуществ в производительности для небольших типов перечислений, его можно было удалить из библиотеки, не оказывая негативного влияния на библиотеку коллекций Java. [29]
EnumSet
является хорошей заменой битовых полей , которые представляют собой тип набора, как описано ниже. [30]
Традиционно, когда разработчики сталкивались с элементами перечислимого типа, которые необходимо поместить в набор, они использовали шаблон int enum , в котором каждой константе присваивается разная степень 2. [30] Такое битовое представление позволяет разработчику использовать побитовую операцию ИЛИ, чтобы константы можно было объединить в набор, также известный как битовое поле . Такое представление битового поля позволяет разработчику выполнять эффективные операции над множествами и побитовую арифметику, например пересечение и объединение. [30]
Однако существует множество проблем с подходом к представлению битовых полей . Битовое поле менее читабельно, чем константа перечисления int. [30] Кроме того, если элементы представлены битовыми полями, невозможно перебрать все. этих элементов. [30]
Рекомендуемый альтернативный подход – использовать EnumSet
, где вместо битового поля используется целое перечисление . [30] Этот подход использует EnumSet
для представления набора значений, принадлежащих одному и тому же Enum
тип. [30] Поскольку EnumSet
реализует Set
интерфейс и больше не требует использования побитовых операций, этот подход более типобезопасен. [30] Более того, существует множество статических фабрик, которые позволяют создавать экземпляры объектов, например метод EnumSet.of()
метод. [30]
После введения EnumSet
, подход к представлению битовых полей считается устаревшим. [30]
Класс Хэшсет
[ редактировать ]HashSet
использует хеш-таблицу. Более конкретно, он использует java.util.LinkedHashMap
для хранения хешей и элементов и предотвращения дублирования.
Класс LinkedHashSet
[ редактировать ]The java.util.LinkedHashSet
класс расширяется HashSet
путем создания двусвязного списка, который связывает все элементы в порядке их вставки. Это гарантирует, что порядок итераций по Set
предсказуем.
Класс CopyOnWriteArraySet
[ редактировать ]CopyOnWriteArraySet
является одновременной заменой синхронизированного Set
. Во многих ситуациях он обеспечивает улучшенный параллелизм, устраняя необходимость выполнять синхронизацию или создавать копию объекта во время итерации, аналогично тому, как CopyOnWriteArrayList
действует как одновременная замена синхронизированного List
. [31] С другой стороны, аналогично CopyOnWriteArrayList
, CopyOnWriteArraySet
не следует использовать, когда синхронизация обязательна.
Интерфейс сортированного набора
[ редактировать ]The java.util.SortedSet
интерфейс расширяет возможности java.util.Set
интерфейс. В отличие от обычного Set
, элементы в SortedSet
сортируются либо по элементу compareTo(T o)
метод или метод, предоставленный конструктору SortedSet
. Первый и последний элементы SortedSet
можно получить с помощью first()
и last()
методы соответственно, а подмножества можно создавать с помощью минимальных и максимальных значений, а также начинать или заканчивать в начале или конце SortedSet
. java.util.TreeSet
класс реализует SortedSet
интерфейс. [32]
Интерфейс NavigableSet
[ редактировать ]The java.util.NavigableSet
интерфейс расширяет возможности java.util.SortedSet
интерфейс и имеет несколько дополнительных методов. floor(E e)
, ceiling(E e)
, lower(E e)
, и higher(E e)
методы находят в наборе элемент, близкий к параметру. Кроме того, нисходящий итератор по элементам в Set
предоставляется. Как и в случае с SortedSet
, java.util.TreeSet
реализует NavigableSet
. [33]
Класс TreeSet
[ редактировать ]java.util.TreeSet
использует красно-черное дерево, реализованное java.util.TreeMap
. Красно-черное дерево гарантирует отсутствие дубликатов. Кроме того, это позволяет TreeSet
реализовать java.util.SortedSet
. [34]
Класс ConcurrentSkipListSet
[ редактировать ]ConcurrentSkipListSet
действует как одновременная замена реализаций синхронизированного SortedSet
. Например, он заменяет TreeSet
который был обернут synchronizedMap
метод. [35]
Карта интерфейсов
[ редактировать ]Карты определяются java.util.Map
интерфейс на Java.
Реализации интерфейса карты
[ редактировать ]Карты — это структуры данных, которые связывают ключ с элементом. Это позволяет карте быть очень гибкой. Если ключом является хеш-код элемента, Map
по сути является Set
. Если это просто увеличивающееся число, оно становится списком.
Примеры Map
реализации включают в себя java.util.HashMap
, java.util.LinkedHashMap
, и java.util.TreeMap
.
Класс AbstractMap
[ редактировать ]AbstractMap
является примером скелетной реализации . [14]
Прямые подклассы AbstractMap
класс включает ConcurrentSkipListMap
, EnumMap
, HashMap
, IdentityHashMap
, TreeMap
и WeakHashMap
.
Энуммап
[ редактировать ]EnumMap
простирается AbstractMap
. EnumMap
имеет сопоставимую скорость с массивом с порядковым индексом. [36] Это потому, что EnumMap
внутри использует массив, детали реализации которого полностью скрыты от разработчика. [36] Следовательно, EnumMap получает безопасность типа Map
в то время как преимущества производительности массива. [36]
Хэшмап
[ редактировать ]HashMap
использует хеш-таблицу . Хэши ключей используются для поиска элементов в различных сегментах. HashMap
представляет собой коллекцию на основе хеша. [37]
LinkedHashMap
[ редактировать ]LinkedHashMap
простирается HashMap
путем создания двусвязного списка между элементами, что позволяет получать к ним доступ в том порядке, в котором они были вставлены на карту. LinkedHashMap
содержит protected
removeEldestEntry
метод, который вызывается put
метод всякий раз, когда новый ключ добавляется в Map
. [38] Map
удаляет самую старую запись всякий раз, когда removeEldestEntry
возвращает истину. [38] removeEldestEntry
метод можно переопределить. [38]
ДеревоКарта
[ редактировать ]TreeMap
, в отличие от HashMap
и LinkedHashMap
, использует красно-черное дерево. Ключи используются в качестве значений узлов дерева, а узлы указывают на элементы в дереве. Map
. [39]
ConcurrentHashMap
[ редактировать ]ConcurrentHashMap
похоже на HashMap
а также представляет собой коллекцию на основе хеша. [37] Однако существует ряд отличий, например, различия в используемой ими стратегии блокировки.
The ConcurrentHashMap
использует совершенно другую стратегию блокировки для обеспечения улучшенной масштабируемости и параллелизма. [37] ConcurrentHashMap
не синхронизирует каждый метод, используя одну и ту же блокировку. [37] Вместо, ConcurrentHashMap
используйте механизм, известный как чередование блокировок . [37] Этот механизм обеспечивает более мелкозернистый механизм блокировки. [37] Это также обеспечивает более высокую степень общего доступа. [37]
Класс ConcurrentSkipListMap
[ редактировать ]ConcurrentSkipListMap
действует как одновременная замена реализаций синхронизированного SortedMap
. ConcurrentSkipListMap
очень похоже на ConcurrentSkipListSet
, с ConcurrentSkipListMap
заменяет TreeMap
который был обернут synchronizedMap
метод. [35]
Подинтерфейсы карты
[ редактировать ]Интерфейс сортированной карты
[ редактировать ]The java.util.SortedMap
интерфейс расширяет возможности java.util.Map
интерфейс. Этот интерфейс определяет Map
это отсортировано по предоставленным ключам. Используя еще раз compareTo()
метод или метод, предоставленный в конструкторе для SortedMap
, пары ключ-элемент сортируются по ключам. Первый и последний ключи в Map
можно вызвать с помощью firstKey()
и lastKey()
методы соответственно. Кроме того, подкарты можно создавать из минимальных и максимальных ключей с помощью subMap(K fromKey, K toKey)
метод. SortedMap
реализуется java.util.TreeMap
. [40]
Интерфейс НавигаблеКарта
[ редактировать ]The java.util.NavigableMap
интерфейс расширяется java.util.SortedMap
различными способами. Могут быть вызваны методы, которые находят ключ или запись карты, ближайшую к данному ключу в любом направлении. Карту также можно перевернуть и сгенерировать из нее итератор в обратном порядке. Это реализовано java.util.TreeMap
. [41]
Интерфейс ConcurrentMap
[ редактировать ]The java.util.concurrent.ConcurrentMap
интерфейс расширяет возможности java.util.Map
интерфейс. Этот интерфейс потокобезопасен Map
языка программирования Java интерфейс, представленный в версии 1.5 Java Collections Framework . [20]
Расширения платформы коллекций Java
[ редактировать ]Платформа коллекций Java расширена библиотекой коллекций Apache Commons , которая добавляет такие типы коллекций, как сумка и двунаправленная карта, а также утилиты для создания объединений и пересечений. [42]
Google выпустила собственные библиотеки коллекций в рамках библиотек гуавы .
См. также
[ редактировать ]Цитирование
[ редактировать ]- ^ «Урок: Знакомство с коллекциями» . Корпорация Оракл . Проверено 22 декабря 2010 г.
- ^ Перейти обратно: а б с Bloch 2018 , стр. 126–129, глава §5, пункт 28. Предпочитайте списки массивам.
- ^ Перейти обратно: а б Хорстманн, Кей (2014). Большие ранние объекты Java .
- ^ Перейти обратно: а б «Структура коллекций Java» (PDF) . ИБМ . Архивировано из оригинала (PDF) 7 августа 2011 г.
- ^ Беккер, Дэн (1 ноября 1998 г.). «Начало работы с Java Collections Framework» . JavaWorld . Проверено 13 июля 2020 г.
До того, как Collections дебютировали так долго, стандартные методы группировки объектов Java использовались с помощью массива, вектора и хэш-таблицы. Все три коллекции имеют разные методы и синтаксис для доступа к элементам: массивы используют символы квадратных скобок ([]), Vector использует метод elementAt, а Hashtable использует
get
иput
методы. - ^ Перейти обратно: а б Леа, Дуг . «Обзор пакета коллекций» . Проверено 1 января 2011 г.
В состав Sun Java Development Kit JDK1.2 наконец-то включен стандартный набор классов коллекций. Несмотря на некоторые различия в дизайне и реализации, пакет JDK1.2 содержит большую часть тех же базовых абстракций, структуры и функций, что и этот пакет. По этой причине этот пакет коллекций НЕ будет в дальнейшем обновляться.
- ^ «Общая библиотека коллекций для Java™» . Архивировано из оригинала 12 марта 2009 г. Проверено 1 января 2011 г.
- ^ Ванхелсуве, Лоуренс (1 июня 1997 г.). «Нужен хороший набор абстрактных структур данных? JGL от ObjectSpace — это отличный вариант!» . JavaWorld . Проверено 13 июля 2020 г.
Как и в случае с самой Java, универсальная библиотека Java во многом заимствована из лагеря C++: она берет лучшее от STL C++, оставляя при этом недостатки C++. Большинство программистов C++ сегодня знают о своем STL, но лишь немногим удается использовать его потенциал.
- ^ Ванхельсуве, Лоуренс (1 января 1999 г.). «Битва контейнерных фреймворков: какую использовать?» . JavaWorld . Проверено 13 июля 2020 г.
Сравнение JGL компании ObjectSpace Inc. и Sun Collections Framework похоже на сравнение яблок и киви. На первый взгляд кажется, что эти две платформы конкурируют за одних и тех же разработчиков, но после более внимательного изучения становится ясно, что их нельзя сравнивать честно, не признав сначала, что эти две платформы преследуют разные цели. Если, как утверждается в документации Sun, Collections собирается гомогенизировать собственные API Sun (основной API, расширения и т. д.), то очевидно, что Collections должна стать отличной новостью и хорошей вещью даже для самого фанатичного любителя JGL. При условии, что Sun не нарушит своих обещаний в этой области, я буду рад вложить свои ресурсы в серьезное внедрение Коллекций.
- ^ Леа, Дуг . «Обзор пакета util.concurrent Release 1.3.4» . Проверено 1 января 2011 г.
Примечание. После выпуска J2SE 5.0 этот пакет переходит в режим обслуживания: будут выпущены только существенные исправления. Пакет J2SE5 java.util.concurrent включает улучшенные, более эффективные и стандартизированные версии основных компонентов этого пакета.
- ^ Bloch 2018 , стр. 87–92, Глава §8, пункт 8: Отдавайте предпочтение композиции, а не наследованию.
- ^ «Итерируемый (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Bloch 2018 , стр. 117–122, Глава §5, пункт 26: Не используйте необработанные типы.
- ^ Перейти обратно: а б с Bloch 2018 , стр. 99–103, глава §4, пункт 20. Предпочитайте интерфейсы абстрактным классам.
- ^ «Список (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Перейти обратно: а б Bloch 2018 , стр. 87–92, Глава §4, пункт 18: Отдавайте предпочтение композиции, а не наследованию.
- ^ Перейти обратно: а б с Bloch 2018 , стр. 317–322, глава §11, пункт 79. Избегайте чрезмерной синхронизации.
- ^ Перейти обратно: а б Bloch 2018 , стр. 280–281, Глава §9, пункт 64. Обращайтесь к объектам по их интерфейсам.
- ^ «PriorityQueue (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Перейти обратно: а б с Гетц и др. 2006 , стр. 84–85, §5.2 Параллельные коллекции.
- ^ Перейти обратно: а б с Гетц и др. 2006 , стр. 52–53, §3.5.3 Идиомы безопасной публикации.
- ^ «BlockingQueue (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Bloch 2018 , стр. 325–329, Глава §11, пункт 81. Предпочитайте утилиты параллелизма для ожидания и уведомления.
- ^ Перейти обратно: а б Гетц и др. 2006 , с. 92, §5.3.3 Деки и воровство работы.
- ^ «Дек (Платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Перейти обратно: а б «Очередь (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ «BlockingDeque (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Перейти обратно: а б с д и Bloch 2018 , стр. 5–9, глава §5. Используйте EnumSet вместо битовых полей.
- ^ Перейти обратно: а б с д и ж г час я дж к Bloch 2018 , стр. 169–170, глава §5. Используйте EnumSet вместо битовых полей.
- ^ Гетц и др. 2006 , стр. 86–89, §5.2.3 CopyOnWriteArrayList.
- ^ «SortedSet (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ «NavigableSet (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013.
- ^ «Установить (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ Перейти обратно: а б Гетц и др. 2006 , стр. 84–85, §5.2 ConcurrentCollections.
- ^ Перейти обратно: а б с Bloch 2018 , стр. 171–175, глава §6, пункт 36. Используйте EnumMap вместо порядкового индексирования.
- ^ Перейти обратно: а б с д и ж г Гетц и др. 2006 , стр. 85–86, §5.2.1 ConcurrentHashMap.
- ^ Перейти обратно: а б с Bloch 2018 , стр. 199–202, глава §44. Отдавайте предпочтение использованию стандартных функциональных интерфейсов.
- ^ «Карта (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ «SortedMap (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ «NavigableMap (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
- ^ «Коллекции - Главная» . Commons.apache.org. 04 июля 2013 г. Проверено 16 августа 2013 г.
Ссылки
[ редактировать ]- Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991 .
- Гетц, Брайан; Пайерлс, Тим; Блох, Джошуа; Боубир, Джозеф; Холмс, Дэвид; Леа, Дуг (2006). Параллелизм Java на практике . Эддисон Уэсли. ISBN 0-321-34960-1 . ОЛ 25208908М .