Spec-Zone.ru › OpenJDK 24

Класс 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>, 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
См. также:
  • 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)
Создаёт новый связанный хеш-набор с теми же элементами, что и в указанной коллекции.

Краткое описание методов

Модификатор и тип Метод Описание
void addFirst(E e)
Добавляет элемент как первый элемент этой коллекции (необязательная операция).
void addLast(E e)
Добавляет элемент как последний элемент этой коллекции (необязательная операция).
E getFirst()
Возвращает первый элемент этой коллекции.
E getLast()
Возвращает последний элемент этой коллекции.
static <T> LinkedHashSet<T> newLinkedHashSet(int numElements)
Создаёт новый пустой LinkedHashSet, подходящий для ожидаемого количества элементов.
E removeFirst()
Удаляет и возвращает первый элемент этой коллекции (необязательная операция).
E removeLast()
Удаляет и возвращает последний элемент этой коллекции (необязательная операция).
SequencedSet<E> reversed()
Возвращает просматриваемую коллекцию этого набора в обратном порядке.
Spliterator<E> 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

Методы, объявленные в интерфейсе 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)
Создаёт новый пустой связный хэш-сет с заданной начальной ёмкостью и коэффициентом загрузки.
Примечание API:
Чтобы создать LinkedHashSet с начальной ёмкостью, достаточной для ожидаемого количества элементов, используйте newLinkedHashSet.
Параметры:
initialCapacity - начальная ёмкость связного хэш-сета
loadFactor - коэффициент загрузки связного хэш-сета
Исключения:
IllegalArgumentException - если начальная ёмкость меньше нуля или коэффициент загрузки не положителен

LinkedHashSet

public LinkedHashSet(int initialCapacity)
Создаёт новый пустой связный хэш-сет с заданной начальной ёмкостью и коэффициентом загрузки по умолчанию (0.75).
Примечание API:
Чтобы создать LinkedHashSet с начальной ёмкостью, достаточной для ожидаемого количества элементов, используйте newLinkedHashSet.
Параметры:
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.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)
Создаёт новый пустой LinkedHashSet, подходящий для ожидаемого числа элементов. Возвращаемый сет использует коэффициент загрузки по умолчанию 0.75, и его начальная ёмкость обычно достаточно велика, чтобы ожидаемое число элементов могло быть добавлено без изменения размера сета.
Параметры типа:
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API