Spec-Zone.ru › OpenJDK 8

Класс LinkedHashSet<E>

  • java.lang.Object
    • java.util.AbstractCollection<E>
      • java.util.AbstractSet<E>
        • java.util.HashSet<E>
          • java.util.LinkedHashSet<E>
Type Parameters:
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, Serialized Form

Конструкторы

Конструктор и описание
LinkedHashSet()

Создаёт новое пустое связанное хеш-множество с начальной ёмкостью по умолчанию (16) и коэффициентом заполнения (0,75).

LinkedHashSet(Collection<? extends E> c)

Создаёт новое связанное хеш-множество с теми же элементами, что и в указанном множестве.

LinkedHashSet(int initialCapacity)

Создаёт новое пустое связанное хеш-множество с указанной начальной ёмкостью и коэффициентом заполнения по умолчанию (0,75).

LinkedHashSet(int initialCapacity, float loadFactor)

Создаёт новое пустое связанное хеш-множество с указанной начальной ёмкостью и коэффициентом заполнения.

Методы

Модификатор и тип Метод и описание
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.Set

add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray

Наследованные методы из интерфейса java.util.Collection

parallelStream, removeIf, stream

Наследованные методы из интерфейса java.lang.Iterable

forEach

Детали конструкторов

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.SIZED, Spliterator.DISTINCT и ORDERED. Реализации должны документировать сообщения о дополнительных значениях характеристик.

Задано:
spliterator в интерфейсе Iterable<E>
Задано:
spliterator в интерфейсе Collection<E>
Задано:
spliterator в интерфейсе Set<E>
Переопределяет:
spliterator в классе HashSet<E>
Замечание о реализации:
Реализация создаёт отложенный итератор на основе Iterator множества. Итератор наследует свойства быстрой проверки итератора множества. Созданный итератор дополнительно сообщает Spliterator.SUBSIZED.
Возвращает:
итератор по элементам в этом множестве
С тех пор:
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.

Spec-Zone.ru

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