Jump to content

Платформа коллекций Java

(Перенаправлено из Java Collections Framework )
Класс java.util.Collection и иерархия интерфейса
Класс Java java.util.Map и иерархия интерфейсов

Платформа Java коллекций представляет собой набор классов и интерфейсов коллекций , которые реализуют часто используемые повторно используемые структуры данных . [1]

Хотя его называют фреймворком , он работает по принципу библиотеки . Платформа коллекций предоставляет как интерфейсы, определяющие различные коллекции, так и классы, их реализующие.

Отличия от массивов

[ редактировать ]

CollectionИ массивы схожи в том, что они оба содержат ссылки на объекты и ими можно управлять как группой. Однако, в отличие от массивов, Collections не нужно назначать определенную емкость при создании экземпляра. Collections может автоматически увеличиваться и уменьшаться в размерах при добавлении или удалении объектов.

Collections не может содержать примитивные типы данных, такие как int, long, или double. [2] Вместо, Collections может содержать классы-оболочки, такие как java.lang.Integer, java.lang.Long, или java.lang.Double. [3]

Collections являются общими и, следовательно, инвариантными, но массивы ковариантны . Это можно считать преимуществом универсальных объектов, таких как Collection по сравнению с массивами, потому что при определенных обстоятельствах использование общего Collection вместо массива предотвращает исключения во время выполнения, вместо этого выдавая исключение во время компиляции, чтобы сообщить разработчику о необходимости исправить код. Например, если разработчик объявляет Object[] объект и назначает Object[] объект к значению, возвращаемому новым Long[] экземпляр с определенной емкостью, исключение во время компиляции не будет выдано. Если разработчик попытается добавить String к этому Long[] объект, Java-программа выдаст ArrayStoreException. С другой стороны, если разработчик вместо этого объявил новый экземпляр Collection<Object> как ArrayList<Long>, компилятор Java (правильно) выдаст исключение во время компиляции, чтобы указать, что код написан с несовместимым и неправильным типом, тем самым предотвращая любые потенциальные исключения во время выполнения. Разработчик может исправить код, создав экземпляр Collection<Object> как ArrayList<Object> объект. Если в коде используется Java SE7 или более поздние версии, разработчик может создать Collection<Object> как ArrayList<> объект с помощью оператора ромба [2]

Collections являются универсальными и, следовательно, реифицированы , но массивы не реифицированы. [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]

[ редактировать ]

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 простирается 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 выпустила собственные библиотеки коллекций в рамках библиотек гуавы .

См. также

[ редактировать ]

Цитирование

[ редактировать ]
  1. ^ «Урок: Знакомство с коллекциями» . Корпорация Оракл . Проверено 22 декабря 2010 г.
  2. ^ Перейти обратно: а б с Bloch 2018 , стр. 126–129, глава §5, пункт 28. Предпочитайте списки массивам.
  3. ^ Перейти обратно: а б Хорстманн, Кей (2014). Большие ранние объекты Java .
  4. ^ Перейти обратно: а б «Структура коллекций Java» (PDF) . ИБМ . Архивировано из оригинала (PDF) 7 августа 2011 г.
  5. ^ Беккер, Дэн (1 ноября 1998 г.). «Начало работы с Java Collections Framework» . JavaWorld . Проверено 13 июля 2020 г. До того, как Collections дебютировали так долго, стандартные методы группировки объектов Java использовались с помощью массива, вектора и хэш-таблицы. Все три коллекции имеют разные методы и синтаксис для доступа к элементам: массивы используют символы квадратных скобок ([]), Vector использует метод elementAt, а Hashtable использует get и put методы.
  6. ^ Перейти обратно: а б Леа, Дуг . «Обзор пакета коллекций» . Проверено 1 января 2011 г. В состав Sun Java Development Kit JDK1.2 наконец-то включен стандартный набор классов коллекций. Несмотря на некоторые различия в дизайне и реализации, пакет JDK1.2 содержит большую часть тех же базовых абстракций, структуры и функций, что и этот пакет. По этой причине этот пакет коллекций НЕ будет в дальнейшем обновляться.
  7. ^ «Общая библиотека коллекций для Java™» . Архивировано из оригинала 12 марта 2009 г. Проверено 1 января 2011 г.
  8. ^ Ванхелсуве, Лоуренс (1 июня 1997 г.). «Нужен хороший набор абстрактных структур данных? JGL от ObjectSpace — это отличный вариант!» . JavaWorld . Проверено 13 июля 2020 г. Как и в случае с самой Java, универсальная библиотека Java во многом заимствована из лагеря C++: она берет лучшее от STL C++, оставляя при этом недостатки C++. Большинство программистов C++ сегодня знают о своем STL, но лишь немногим удается использовать его потенциал.
  9. ^ Ванхельсуве, Лоуренс (1 января 1999 г.). «Битва контейнерных фреймворков: какую использовать?» . JavaWorld . Проверено 13 июля 2020 г. Сравнение JGL компании ObjectSpace Inc. и Sun Collections Framework похоже на сравнение яблок и киви. На первый взгляд кажется, что эти две платформы конкурируют за одних и тех же разработчиков, но после более внимательного изучения становится ясно, что их нельзя сравнивать честно, не признав сначала, что эти две платформы преследуют разные цели. Если, как утверждается в документации Sun, Collections собирается гомогенизировать собственные API Sun (основной API, расширения и т. д.), то очевидно, что Collections должна стать отличной новостью и хорошей вещью даже для самого фанатичного любителя JGL. При условии, что Sun не нарушит своих обещаний в этой области, я буду рад вложить свои ресурсы в серьезное внедрение Коллекций.
  10. ^ Леа, Дуг . «Обзор пакета util.concurrent Release 1.3.4» . Проверено 1 января 2011 г. Примечание. После выпуска J2SE 5.0 этот пакет переходит в режим обслуживания: будут выпущены только существенные исправления. Пакет J2SE5 java.util.concurrent включает улучшенные, более эффективные и стандартизированные версии основных компонентов этого пакета.
  11. ^ Bloch 2018 , стр. 87–92, Глава §8, пункт 8: Отдавайте предпочтение композиции, а не наследованию.
  12. ^ «Итерируемый (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  13. ^ Bloch 2018 , стр. 117–122, Глава §5, пункт 26: Не используйте необработанные типы.
  14. ^ Перейти обратно: а б с Bloch 2018 , стр. 99–103, глава §4, пункт 20. Предпочитайте интерфейсы абстрактным классам.
  15. ^ «Список (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  16. ^ Перейти обратно: а б Bloch 2018 , стр. 87–92, Глава §4, пункт 18: Отдавайте предпочтение композиции, а не наследованию.
  17. ^ Перейти обратно: а б с Bloch 2018 , стр. 317–322, глава §11, пункт 79. Избегайте чрезмерной синхронизации.
  18. ^ Перейти обратно: а б Bloch 2018 , стр. 280–281, Глава §9, пункт 64. Обращайтесь к объектам по их интерфейсам.
  19. ^ «PriorityQueue (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  20. ^ Перейти обратно: а б с Гетц и др. 2006 , стр. 84–85, §5.2 Параллельные коллекции.
  21. ^ Перейти обратно: а б с Гетц и др. 2006 , стр. 52–53, §3.5.3 Идиомы безопасной публикации.
  22. ^ Bloch 2018 , стр. 325–329, Глава §11, пункт 78: Синхронизация доступа к общим изменяемым данным.
  23. ^ «BlockingQueue (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  24. ^ Bloch 2018 , стр. 325–329, Глава §11, пункт 81. Предпочитайте утилиты параллелизма для ожидания и уведомления.
  25. ^ Перейти обратно: а б Гетц и др. 2006 , с. 92, §5.3.3 Деки и воровство работы.
  26. ^ «Дек (Платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  27. ^ Перейти обратно: а б «Очередь (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  28. ^ «BlockingDeque (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  29. ^ Перейти обратно: а б с д и Bloch 2018 , стр. 5–9, глава §5. Используйте EnumSet вместо битовых полей.
  30. ^ Перейти обратно: а б с д и ж г час я дж к Bloch 2018 , стр. 169–170, глава §5. Используйте EnumSet вместо битовых полей.
  31. ^ Гетц и др. 2006 , стр. 86–89, §5.2.3 CopyOnWriteArrayList.
  32. ^ «SortedSet (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  33. ^ «NavigableSet (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013.
  34. ^ «Установить (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  35. ^ Перейти обратно: а б Гетц и др. 2006 , стр. 84–85, §5.2 ConcurrentCollections.
  36. ^ Перейти обратно: а б с Bloch 2018 , стр. 171–175, глава §6, пункт 36. Используйте EnumMap вместо порядкового индексирования.
  37. ^ Перейти обратно: а б с д и ж г Гетц и др. 2006 , стр. 85–86, §5.2.1 ConcurrentHashMap.
  38. ^ Перейти обратно: а б с Bloch 2018 , стр. 199–202, глава §44. Отдавайте предпочтение использованию стандартных функциональных интерфейсов.
  39. ^ «Карта (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  40. ^ «SortedMap (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  41. ^ «NavigableMap (платформа Java SE 7)» . Документы.oracle.com. 06.06.2013 . Проверено 16 августа 2013 г.
  42. ^ «Коллекции - Главная» . Commons.apache.org. 04 июля 2013 г. Проверено 16 августа 2013 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 038ac106b03b58bf9a94fe94b6cedb98__1708845660
URL1:https://arc.ask3.ru/arc/aa/03/98/038ac106b03b58bf9a94fe94b6cedb98.html
Заголовок, (Title) документа по адресу, URL1:
Java collections framework - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)