Spec-Zone.ru › OpenJDK 21

Класс LinkedHashSet<E>

java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractSet<E>
java.util.HashSet<E>
java.util.LinkedHashSet<E>
Type Parameters:
E - тип элементов, поддерживаемых этим множеством
Все реализованные интерфейсы:
Serializable, Cloneable, Iterable<E>, Collection<E>, SequencedCollection<E>, SequencedSet<E>, Set<E>
public class LinkedHashSet<E> extends HashSet<E> implements SequencedSet<E>, Cloneable, Serializable

Реализация интерфейса Set на основе хеш-таблицы и связанного списка с чётко определённым порядком встреч. Данная реализация отличается от HashSet тем, что она поддерживает двусвязный список, проходящий через все её элементы. Этот связанный список определяет порядок встреч (порядок итерации), который соответствует порядку добавления элементов в множество (порядок добавления). Наименее недавно добавленный элемент (самый старый) идёт первым, а самый молодой — последним. Обратите внимание, что порядок встреч не изменяется, если элемент перевставлен в множество с помощью метода add. (Элемент e перевставлен в множество s, если s.add(e) вызывается, когда s.contains(e) вернул бы true непосредственно перед вызовом.) Обратный порядок просмотра этого множества будет обратным, при этом самый молодой элемент будет первым, а самый старый — последним. Порядок встреч элементов, уже находящихся в множестве, может быть изменён с помощью методов addFirst и addLast.

Данная реализация освобождает клиентов от неуказанного, как правило, хаотичного порядка, предоставляемого классом HashSet, не неся при этом повышенных затрат, связанных с классом TreeSet. Она может быть использована для создания копии множества с тем же порядком, что и исходное, независимо от реализации исходного множества:


     void foo(Set<String> s) {
         Set<String> copy = new LinkedHashSet<>(s);
         ...
     }
 
Этот приём особенно полезен, если модуль принимает множество в качестве входных данных, копирует его и впоследствии возвращает результаты, порядок которых определяется порядком этой копии. (Клиенты, как правило, ценят получение результатов в том же порядке, в котором они были представлены.)

Этот класс предоставляет все необязательные операции Set и SequencedSet, а также допускает нулевые элементы. Как и HashSet, он обеспечивает постоянное время выполнения основных операций (add, contains и remove) при условии, что хеш-функция должным образом распределяет элементы по ячейкам. Скорость работы, вероятно, будет немного ниже, чем у HashSet, из-за дополнительных затрат на поддержание связанного списка, за исключением одного случая: итерация над LinkedHashSet требует времени, пропорционального размеру множества, независимо от его емкости. Итерация над HashSet будет, вероятно, более дорогой, требуя времени, пропорционального его емкости.

Связанное хеш-множество имеет два параметра, влияющих на его производительность: начальную емкость и коэффициент загрузки. Они определены точно так же, как и для HashSet. Однако, штраф за выбор слишком большого значения для начальной емкости для этого класса меньше, чем для HashSet, так как время итерации для этого класса не зависит от емкости.

Обратите внимание, что данная реализация не является синхронизированной. Если несколько потоков обращаются к связанному хеш-множеству одновременно, и по крайней мере один из потоков модифицирует множество, то оно должно быть синхронизировано внешним образом. Обычно это достигается синхронизацией на некотором объекте, естественным образом инкапсулирующем множество. Если такой объект не существует, множество следует "обернуть" с помощью метода Collections.synchronizedSet. Лучше всего это сделать на этапе создания, чтобы предотвратить случайный несинхронизированный доступ к множеству:

   Set s = Collections.synchronizedSet(new LinkedHashSet(...));

Итераторы, возвращаемые методом iterator этого класса, являются быстропроверяемыми: если множество модифицируется в любое время после создания итератора, любым способом, кроме метода самого итератора remove, итератор выбросит исключение ConcurrentModificationException. Таким образом, при одновременной модификации итератор быстро и корректно завершает работу, вместо того, чтобы рисковать произвольным, непредсказуемым поведением в неопределённое время в будущем.

Обратите внимание, что поведение быстропроверяемого итератора не может быть гарантировано, так как, вообще говоря, невозможно сделать какие-либо жёсткие гарантии при одновременной модификации без синхронизации. Быстропроверяемые итераторы выбрасывают ConcurrentModificationException на основе наилучшего усилия. Поэтому было бы неправильно писать программу, которая полагалась бы на это исключение для своей корректности: поведение быстропроверяемых итераторов следует использовать только для обнаружения ошибок.

Этот класс является членом Java Collections Framework.

Since:
1.4
See Also:
  • Object.hashCode()
  • Collection
  • Set
  • HashSet
  • TreeSet
  • Hashtable
  • Сериализованная форма

Краткое описание конструкторов

Конструктор Описание
LinkedHashSet()
Создаёт новое пустое связанное хеш-множество с начальной ёмкостью по умолчанию (16) и коэффициентом загрузки (0,75).
LinkedHashSet(int initialCapacity)
Создаёт новое пустое связанное хеш-множество со заданной начальной ёмкостью и коэффициентом загрузки по умолчанию (0,75).
LinkedHashSet(int initialCapacity, float loadFactor)
Создаёт новое пустое связанное хеш-множество со заданной начальной ёмкостью и коэффициентом загрузки.
LinkedHashSet(Collection<? extends E> c)
Создаёт новое связанное хеш-множество с теми же элементами, что и указанное множество.

Краткое описание методов

Модификатор и тип Метод Описание
void addFirst(E e)
Добавляет элемент в качестве первого элемента этого множества (необязательная операция).
void addLast(E e)
Добавляет элемент в качестве последнего элемента этого множества (необязательная операция).
E getFirst()
Возвращает первый элемент этого множества.
E getLast()
Возвращает последний элемент этого множества.
static <T> LinkedHashSet<T> newLinkedHashSet(int numElements)
Создаёт новое пустое LinkedHashSet, подходящее для ожидаемого числа элементов.
E removeFirst()
Удаляет и возвращает первый элемент этого множества (необязательная операция).
E removeLast()
Удаляет и возвращает последний элемент этого множества (необязательная операция).
SequencedSet<E> reversed()
Возвращает вид этого множества, отсортированный в обратном порядке.
Spliterator<E> spliterator()
Создаёт отложенную и быстропроверяемую Spliterator по элементам этого множества.

Методы, объявленные в классе java.util.HashSet

add, clear, clone, contains, isEmpty, iterator, newHashSet, remove, size, toArray, toArray

Методы, объявленные в классе java.util.AbstractSet

equals, hashCode, removeAll

Методы, объявленные в классе java.util.AbstractCollection

addAll, containsAll, retainAll, toArray, toArray, toString

Методы, объявленные в классе java.lang.Object

finalize, getClass, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе java.util.Collection

parallelStream, removeIf, stream, toArray

Методы, объявленные в интерфейсе java.lang.Iterable

forEach

Методы, объявленные в интерфейсе java.util.Set

add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray

Подробное описание конструкторов

LinkedHashSet

public LinkedHashSet(int initialCapacity, float loadFactor)
Создаёт новый пустой связный хеш-сет с заданной начальной ёмкостью и коэффициентом заполнения.
Примечание API:
Для создания LinkedHashSet с начальной ёмкостью, достаточной для ожидаемого числа элементов, используйте newLinkedHashSet.
Параметры:
initialCapacity - начальная ёмкость связного хеш-сета
loadFactor - коэффициент заполнения связного хеш-сета
Исключения:
IllegalArgumentException - если начальная ёмкость меньше нуля или если коэффициент заполнения не положительный

LinkedHashSet

public LinkedHashSet(int initialCapacity)
Создаёт новый пустой связный хеш-сет с заданной начальной ёмкостью и стандартным коэффициентом заполнения (0,75).
Примечание API:
Для создания LinkedHashSet с начальной ёмкостью, достаточной для ожидаемого числа элементов, используйте newLinkedHashSet.
Параметры:
initialCapacity - начальная ёмкость LinkedHashSet
Исключения:
IllegalArgumentException - если начальная ёмкость меньше нуля

LinkedHashSet

public LinkedHashSet()
Создаёт новый пустой связный хеш-сет со стандартной начальной ёмкостью (16) и коэффициентом заполнения (0,75).

LinkedHashSet

public LinkedHashSet(Collection<? extends E> c)
Создаёт новый связный хеш-сет с теми же элементами, что и в указанной коллекции. Связный хеш-сет создаётся с начальной ёмкостью, достаточной для хранения элементов в указанной коллекции, и стандартным коэффициентом заполнения (0,75).
Параметры:
c - коллекция, чьи элементы должны быть помещены в этот сет
Исключения:
NullPointerException - если указанная коллекция равна null

Подробное описание методов

spliterator

public Spliterator<E> spliterator()
Создаёт поздневязанный и быстродействующий Spliterator над элементами в этом сете.

Spliterator сообщает о Spliterator.SIZED, Spliterator.DISTINCT и ORDERED. Реализации должны документировать сообщения об дополнительных характеристических значениях.

Задано:
spliterator в интерфейсе Collection<E>
Задано:
spliterator в интерфейсе Iterable<E>
Задано:
spliterator в интерфейсе Set<E>
Переопределяет:
spliterator в классе HashSet<E>
Примечание реализации:
Реализация создаёт поздневязанный сплитератор из Iterator сета. Сплитератор наследует свойства быстродействующего итератора сета. Созданный Spliterator дополнительно сообщает о Spliterator.SUBSIZED.
Возвращает:
Spliterator над элементами в этом сете
С:
1.8

newLinkedHashSet

public static <T> LinkedHashSet<T> newLinkedHashSet(int numElements)
Создаёт новый пустой LinkedHashSet, подходящий для ожидаемого количества элементов. Возвращаемый сет использует стандартный коэффициент заполнения 0,75, и его начальная ёмкость, как правило, достаточно велика, чтобы ожидаемое количество элементов можно было добавить без изменения размера сета.
Типы параметров:
T - тип элементов, поддерживаемых новым сетом
Параметры:
numElements - ожидаемое количество элементов
Возвращает:
недавно созданный сет
Исключения:
IllegalArgumentException - если numElements отрицательно
С:
19

addFirst

public void addFirst(E e)
Добавляет элемент в качестве первого элемента этой коллекции (необязательная операция). После нормального завершения этой операции, данный элемент будет являться членом этой коллекции, и он будет первым элементом в порядке встречи.

Если этот сет уже содержит элемент, он переносится при необходимости, чтобы он был первым в порядке встречи.

Задано:
addFirst в интерфейсе SequencedCollection<E>
Параметры:
e - добавляемый элемент
С:
21

addLast

public void addLast(E e)
Добавляет элемент в качестве последнего элемента этой коллекции (необязательная операция). После нормального завершения этой операции, данный элемент будет являться членом этой коллекции, и он будет последним элементом в порядке встречи.

Если этот сет уже содержит элемент, он переносится при необходимости, чтобы он был последним в порядке встречи.

Задано:
addLast в интерфейсе SequencedCollection<E>
Параметры:
e - добавляемый элемент.
С:
21

getFirst

public E getFirst()
Получает первый элемент этой коллекции.
Задано:
getFirst в интерфейсе SequencedCollection<E>
Возвращает:
полученный элемент
Исключения:
NoSuchElementException - если эта коллекция пуста
С:
21

getLast

public E getLast()
Получает последний элемент этой коллекции.
Задано:
getLast в интерфейсе SequencedCollection<E>
Возвращает:
полученный элемент
Исключения:
NoSuchElementException - если эта коллекция пуста
С:
21

removeFirst

public E removeFirst()
Удаляет и возвращает первый элемент этой коллекции (необязательная операция).
Задано:
removeFirst в интерфейсе SequencedCollection<E>
Возвращает:
удаленный элемент
Исключения:
NoSuchElementException - если эта коллекция пуста
С:
21

removeLast

public E removeLast()
Удаляет и возвращает последний элемент этой коллекции (необязательная операция).
Задано:
removeLast в интерфейсе SequencedCollection<E>
Возвращает:
удаленный элемент
Исключения:
NoSuchElementException - если эта коллекция пуста
С:
21

reversed

public SequencedSet<E> reversed()
Возвращает обращённый вид этой коллекции. Порядок встречи элементов в возвращаемом представлении является обратным порядку встречи элементов в этой коллекции. Обратный порядок влияет на все операции, чувствительные к порядку, включая операции над коллекциями представления возвращаемого представления. Если реализация коллекции допускает изменения в этом представлении, изменения «прописываются» в базовую коллекцию. Изменения в базовой коллекции могут или не могут быть видны в этом обращённом представлении, в зависимости от реализации.

Изменения в обращённом представлении допускаются и будут передаваться в этот сет. Кроме того, изменения в этом сете будут видны в обращённом представлении.

Задано:
reversed в интерфейсе SequencedCollection<E>
Задано:
reversed в интерфейсе SequencedSet<E>
Возвращает:
обращённый вид этой коллекции, как SequencedSet
С:
21

© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/LinkedHashSet.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API