Класс LinkedHashSet<E>
- java.lang.Object
-
- java.util.AbstractCollection<E>
-
- java.util.AbstractSet<E>
-
- java.util.HashSet<E>
-
- java.util.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 s) {
Set 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
- См. также:
-
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) | Создает новое связанное хэш-множество с теми же элементами, что и у указанного множества. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
Spliterator<E> | spliterator() | Создает отложенную и быстродействующую |
Методы, объявленные в классе java.util.HashSet
add, clear, clone, contains, isEmpty, iterator, remove, size Методы, объявленные в классе 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) Создает новое пустое связанное хэш-множество со указанной начальной емкостью и коэффициентом загрузки.
- Параметры:
-
initialCapacity- начальная емкость связанного хэш-множества -
loadFactor- коэффициент загрузки связанного хэш-множества - Исключения:
-
IllegalArgumentException- если начальная емкость меньше нуля, или если коэффициент загрузки неположителен
LinkedHashSet
public LinkedHashSet(int initialCapacity)
Создает новое пустое связанное хэш-множество со указанной начальной емкостью и по умолчанию коэффициентом загрузки (0.75).
- Параметры:
-
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
© 1993, 2020, 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/11/docs/api/java.base/java/util/LinkedHashSet.html