Spec-Zone.ru › OpenJDK 25

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

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

Модификатор и тип Метод Описание
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 для элементов этого множества.

Методы, объявленные в классе HashSet

add, clear, clone, contains, isEmpty, iterator, newHashSet, remove, size, toArray, toArray

Методы, объявленные в классе AbstractSet

equals, hashCode, removeAll

Методы, объявленные в классе AbstractCollection

addAll, containsAll, retainAll, toArray, toArray, toString

Методы, объявленные в классе Object

finalize, getClass, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе Collection

parallelStream, removeIf, stream, toArray

Методы, объявленные в интерфейсе Iterable

forEach

Методы, объявленные в интерфейсе 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 для элементов этого множества.

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)
Создаёт новое пустое 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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

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