Класс LinkedHashSet<E>
- Параметры типа:
-
E- тип элементов, поддерживаемых этим множеством
- Все реализуемые интерфейсы:
-
Serializable,Cloneable,Iterable<E>,Collection<E>,Set<E>
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable
Реализация интерфейса Set с использованием хеш-таблицы и связанного списка, обеспечивающая предсказуемый порядок итерации. Эта реализация отличается от HashSet тем, что поддерживает двусвязанный список, проходящий через все его элементы. Этот связанный список определяет порядок итерации, который соответствует порядку добавления элементов в множество (порядок вставки). Обратите внимание, что порядок вставки не изменяется, если элемент перевставлен в множество. (Элемент e перевставлен в множество s если s.add(e) вызван, когда s.contains(e) вернул бы true непосредственно перед вызовом.)
Эта реализация избавляет клиентов от непредсказуемого, как правило, хаотичного порядка, предоставляемого классом HashSet, не неся при этом дополнительных затрат, связанных с классом TreeSet. Его можно использовать для создания копии множества с тем же порядком, что и у исходного, независимо от реализации исходного множества:
void foo(Set<String> s) {
Set<String> copy = new LinkedHashSet<>(s);
...
}
Этот метод особенно полезен, если модуль принимает множество на вход, копирует его, а затем возвращает результаты, порядок которых определяется порядком копии. (Клиенты, как правило, предпочитают получать результаты в том же порядке, в котором они были представлены.) Этот класс предоставляет все необязательные Set операции и допускает 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 |
Создаёт новое связанное хеш-множество с теми же элементами, что и в указанной коллекции. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Spliterator<E> |
spliterator() |
Создаёт отложенную и быстропроваливающуюся Spliterator по элементам в этом множестве. |
Методы, объявленные в классе java.util.HashSet
add, clear, clone, contains, isEmpty, iterator, 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)
- Параметры:
-
initialCapacity- начальная ёмкость связного хеш-сета -
loadFactor- коэффициент загрузки связного хеш-сета - Исключения:
-
IllegalArgumentException- если начальная ёмкость меньше нуля или коэффициент загрузки не положительный
LinkedHashSet
public LinkedHashSet(int initialCapacity)
- Параметры:
-
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> - Примечание реализации:
- Реализация создаёт позднее связывание spliterator из
Iteratorсета. Spliterator наследует свойства быстродействие при обнаружении ошибок итератора сета. СозданныйSpliteratorдополнительно сообщает оSpliterator.SUBSIZED. - Возвращает:
Spliteratorпо элементам в этом сете- С:
- 1.8
© 1993, 2021, 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/17/docs/api/java.base/java/util/LinkedHashSet.html