Класс LinkedHashSet<E>
- Параметры типа:
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.
- С:
- 1.4
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
LinkedHashSet() |
Создаёт новый пустой связанный хеш-набор с начальной ёмкостью по умолчанию (16) и коэффициентом заполнения (0,75). |
LinkedHashSet |
Создаёт новый пустой связанный хеш-набор с указанной начальной ёмкостью и коэффициентом заполнения по умолчанию (0,75). |
LinkedHashSet |
Создаёт новый пустой связанный хеш-набор с указанной начальной ёмкостью и коэффициентом заполнения. |
LinkedHashSet |
Создаёт новый связанный хеш-набор с теми же элементами, что и в указанной коллекции. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
addFirst |
Добавляет элемент как первый элемент этой коллекции (необязательная операция). |
void |
addLast |
Добавляет элемент как последний элемент этой коллекции (необязательная операция). |
E |
getFirst() |
Возвращает первый элемент этой коллекции. |
E |
getLast() |
Возвращает последний элемент этой коллекции. |
static <T> LinkedHashSet |
newLinkedHashSet |
Создаёт новый пустой LinkedHashSet, подходящий для ожидаемого количества элементов. |
E |
removeFirst() |
Удаляет и возвращает первый элемент этой коллекции (необязательная операция). |
E |
removeLast() |
Удаляет и возвращает последний элемент этой коллекции (необязательная операция). |
SequencedSet |
reversed() |
Возвращает просматриваемую коллекцию этого набора в обратном порядке. |
Spliterator |
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
Подробное описание конструкторов
LinkedHashSet
public LinkedHashSet(int initialCapacity, float loadFactor)
- Примечание API:
- Чтобы создать
LinkedHashSetс начальной ёмкостью, достаточной для ожидаемого количества элементов, используйтеnewLinkedHashSet. - Параметры:
-
initialCapacity- начальная ёмкость связного хэш-сета -
loadFactor- коэффициент загрузки связного хэш-сета - Исключения:
-
IllegalArgumentException- если начальная ёмкость меньше нуля или коэффициент загрузки не положителен
LinkedHashSet
public LinkedHashSet(int initialCapacity)
- Примечание API:
- Чтобы создать
LinkedHashSetс начальной ёмкостью, достаточной для ожидаемого количества элементов, используйтеnewLinkedHashSet. - Параметры:
-
initialCapacity- начальная ёмкость LinkedHashSet - Исключения:
-
IllegalArgumentException- если начальная ёмкость меньше нуля
LinkedHashSet
public LinkedHashSet()
LinkedHashSet
public LinkedHashSet(Collection<? extends E> c)
- Параметры:
-
c- коллекция, элементы которой должны быть помещены в этот сет - Исключения:
-
NullPointerException- если указанная коллекция равна null
Подробное описание методов
spliterator
public Spliterator<E> spliterator()
Итератор сообщает о Spliterator.SIZED, Spliterator.DISTINCT и ORDERED. Реализации должны документировать сообщение об дополнительных характеристиках.
- Задано:
-
spliteratorв интерфейсеCollection<E> - Задано:
-
spliteratorв интерфейсеIterable<E> - Задано:
-
spliteratorв интерфейсеSet<E> - Переопределяет:
-
spliteratorв классеHashSet<E> - Примечание реализации:
- Реализация создаёт итератор из
Iteratorсета. Итератор наследует свойства "быстродействующего" итератора сета. Созданный итератор также сообщает оSpliterator.SUBSIZED. - Возвращает:
- итератор по элементам в этом сете
- С:
- 1.8
newLinkedHashSet
public static <T> LinkedHashSet<T> newLinkedHashSet(int numElements)
- Параметры типа:
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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/LinkedHashSet.html