Класс 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:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
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 над элементами в этом сете. 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, 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