Spec-Zone.ru › OpenJDK 27

Класс 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
Модификатор и тип Метод Описание
boolean add(E e)
Добавляет указанный элемент в это множество, если он ещё не присутствует.
void clear()
Удаляет все элементы из этого множества.
Object clone()
Возвращает поверхностную копию этого экземпляра HashSet: сами элементы не клонируются.
boolean contains(Object o)
Возвращает true, если это множество содержит указанный элемент.
boolean isEmpty()
Возвращает true, если это множество не содержит элементов.
Iterator<E> iterator()
Возвращает итератор по элементам этого множества.
static <T> HashSet<T> newHashSet(int numElements)
Создаёт новый пустой HashSet, подходящий для ожидаемого количества элементов.
boolean remove(Object o)
Удаляет указанный элемент из этого множества, если он присутствует.
int size()
Возвращает количество элементов в этом множестве (его мощность).
Object[] toArray()
Возвращает массив, содержащий все элементы этой коллекции.
<T> T[] toArray(T[] a)
Возвращает массив, содержащий все элементы этой коллекции; тип возвращённого массива во время выполнения совпадает с типом указанного массива.

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

equals, hashCode, removeAll
Модификатор и тип Метод Описание
boolean equals(Object o)
Сравнивает указанный объект с этим множеством на равенство.
int hashCode()
Возвращает значение хеш-кода этого множества.
boolean removeAll(Collection<?> c)
Удаляет из этого множества все элементы, содержащиеся в указанной коллекции (необязательная операция).

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

addAll, containsAll, retainAll, toArray, toArray, toString
Модификатор и тип Метод Описание
boolean addAll(Collection<? extends E> c)
Добавляет все элементы указанной коллекции в эту коллекцию (необязательная операция).
boolean containsAll(Collection<?> c)
Возвращает true, если эта коллекция содержит все элементы указанной коллекции.
boolean retainAll(Collection<?> c)
Оставляет в этой коллекции только элементы, содержащиеся в указанной коллекции (необязательная операция).
Object[] toArray()
Возвращает массив, содержащий все элементы этой коллекции.
<T> T[] toArray(T[] a)
Возвращает массив, содержащий все элементы этой коллекции; тип возвращённого массива во время выполнения совпадает с типом указанного массива.
String toString()
Возвращает строковое представление этой коллекции.

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

finalize, getClass, notify, notifyAll, wait, wait, wait
Модификатор и тип Метод Описание
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии.
Финализация устарела и будет удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс этого Object во время выполнения.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
final void wait()
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате уведомления или прерывания.
final void wait(long timeoutMillis)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате уведомления или прерывания, либо до истечения определённого промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате уведомления или прерывания, либо до истечения определённого промежутка реального времени.

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

parallelStream, removeIf, stream, toArray
Модификатор и тип Метод Описание
default Stream<E> parallelStream()
Возвращает, возможно параллельный, Stream с этой коллекцией в качестве источника.
default boolean removeIf(Predicate<? super E> filter)
Удаляет все элементы этой коллекции, удовлетворяющие заданному предикату (необязательная операция).
default Stream<E> stream()
Возвращает последовательный Stream с этой коллекцией в качестве источника.
default <T> T[] toArray(IntFunction<T[]> generator)
Возвращает массив, содержащий все элементы этой коллекции; для выделения возвращаемого массива используется предоставленная функция generator.

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

forEach
Модификатор и тип Метод Описание
default void forEach(Consumer<? super E> action)
Выполняет заданное действие для каждого элемента Iterable, пока не будут обработаны все элементы или действие не выбросит исключение.

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

addAll, containsAll, retainAll
Модификатор и тип Метод Описание
boolean addAll(Collection<? extends E> c)
Добавляет в это множество все элементы указанной коллекции, которых в нём ещё нет (необязательная операция).
boolean containsAll(Collection<?> c)
Возвращает true, если это множество содержит все элементы указанной коллекции.
boolean retainAll(Collection<?> c)
Оставляет в этом множестве только элементы, содержащиеся в указанной коллекции (необязательная операция).

Подробное описание конструкторов

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, 2026, 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.

Spec-Zone.ru

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