Класс 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 и допускает null-элементы. Подобно 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 для элементов этого множества. |
Методы, объявленные в классе HashSet
add, clear, clone, contains, isEmpty, iterator, newHashSet, remove, size, toArray, toArray
Методы, объявленные в классе AbstractSet
equals, hashCode, removeAll
Методы, объявленные в классе AbstractCollection
addAll, containsAll, retainAll, toArray, toArray, toString
Методы, объявленные в интерфейсе 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 для элементов этого множества. 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)
- Параметры типа:
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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/LinkedHashSet.html