Java-класс LinkedHashSet

Класс Java LinkedHashSet расширяет HashSet и реализует интерфейс Set. Он очень похож на класс HashSet, за исключением того, что предлагает предсказуемый порядок итераций.

1. Иерархия LinkedHashSet

Класс LinkedHashSet расширяет класс HashSet и реализует интерфейс Set. Интерфейс Set наследует интерфейсы Collection и Iterable в иерархическом порядке.

public class LinkedHashSet<E> extends HashSet<E>implements Set<E>, Cloneable, Serializable{//implementation}
Иерархия LinkedHashSet
Иерархия LinkedHashSet

 

2. Возможности LinkedHashSet

  • Он расширяет класс HashSet, который расширяет класс AbstractSet.
  • Реализует интерфейс Set.
  • Дублирующиеся значения в LinkedHashSet не допускаются.
  • В LinkedHashSet допускается один элемент NULL.
  • Это упорядоченная коллекция, которая представляет собой порядок, в котором элементы были вставлены в набор(порядок вставки).
  • Как и HashSet, этот класс обеспечивает постоянную производительность по времени для основных операций(добавление, удаление, содержание и размер).
  • LinkedHashSet не синхронизирован. Если несколько потоков одновременно обращаются к набору хэшей и хотя бы один из потоков изменяет набор, он должен быть синхронизирован извне.
  • Используйте метод Collections.synchronizedSet(new LinkedHashSet()) для получения синхронизированного LinkedHashSet.
  • Итераторы, возвращаемые методом итератора этого класса, являются отказоустойчивыми и могут выдать исключение ConcurrentModificationException, если набор будет изменен в любое время после создания итератора любым способом, кроме как с помощью собственного метода итератора remove().
  • LinkedHashSet также реализует интерфейсы Searlizable и Cloneable.

2.1 Начальная мощность

Начальная емкость означает количество корзин(в резервной HashMap ) при создании LinkedHashSet. Количество корзин будет автоматически увеличено, если текущий размер заполнится.

Начальная емкость по умолчанию — 16. Мы можем переопределить эту емкость по умолчанию, передав емкость по умолчанию в его конструкторе LinkedHashSet(int initialCapacity).

2.2 Коэффициент нагрузки

Коэффициент загрузки — это мера того, насколько LinkedHashSet может быть заполнен, прежде чем его емкость будет автоматически увеличена. Коэффициент загрузки по умолчанию — 0,75.

Это называется порогом и равно(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY). Когда количество элементов LinkedHashSet превышает этот порог, размер LinkedHashSet изменяется, и новая емкость вдвое превышает предыдущую.

С LinkedHashSet по умолчанию внутренняя емкость составляет 16, а коэффициент загрузки — 0,75. Количество сегментов автоматически увеличится, когда в таблице будет 12 элементов.

 

3. Конструкторы LinkedHashSet

LinkedHashSet имеет четыре типа конструкторов:

  1. LinkedHashSet(): инициализирует экземпляр LinkedHashSet по умолчанию с начальной емкостью(16) и коэффициентом загрузки(0,75).
  2. LinkedHashSet(int capacity): инициализирует LinkedHashSet с указанной емкостью и коэффициентом загрузки(0,75).
  3. LinkedHashSet(int capacity, float loadFactor): инициализирует LinkedHashSet с указанной начальной емкостью и коэффициентом загрузки.
  4. LinkedHashSet(Collection c): инициализирует LinkedHashSet с теми же элементами, что и указанная коллекция.

 

4. Методы LinkedHashSet

  1. public boolean add(E e) : добавляет указанный элемент в Set, если его еще нет. Этот метод внутренне использует метод equals() для проверки на наличие дубликатов. Если элемент дубликат, то элемент отклоняется, а значение НЕ заменяется.
  2. public void clear() : удаляет все элементы из LinkedHashSet.
  3. public boolean contains(Object o) : возвращает true, если LinkedHashSet содержит указанный элемент, в противном случае возвращает false.
  4. public boolean isEmpty() : возвращает true, если LinkedHashSet не содержит ни одного элемента, в противном случае возвращает false.
  5. public int size() : возвращает количество элементов в LinkedHashSet.
  6. public Iterator<E> iterator() : возвращает итератор по элементам в этом LinkedHashSet. Элементы возвращаются из iterator в произвольном порядке.
  7. public boolean remove(Object o) : удаляет указанный элемент из LinkedHashSet, если он присутствует, и возвращает true, в противном случае возвращает false.
  8. public boolean removeAll(Collection<?> c) : удалить все элементы в LinkedHashSet, которые являются частью указанной коллекции.
  9. public Object clone() : возвращает поверхностную копию LinkedHashSet.
  10. public Spliterator<E> spliterator() : создает Spliterator с поздним связыванием и быстрым отказом для элементов в этом LinkedHashSet. Он имеет следующие свойства инициализации Spliterator.DISTINCT, Spliterator.ORDERED.

 

5. Пример LinkedHashSet

5.1. Пример добавления, удаления итератора LinkedHashSet

//1. Create LinkedHashSetLinkedHashSet<String> LinkedHashSet = new LinkedHashSet<>();//2. Add elements to LinkedHashSetLinkedHashSet.add("A");LinkedHashSet.add("B");LinkedHashSet.add("C");LinkedHashSet.add("D");LinkedHashSet.add("E");System.out.println(LinkedHashSet);//3. Check if element existsboolean found = LinkedHashSet.contains("A"); //trueSystem.out.println(found);//4. Remove an elementLinkedHashSet.remove("D");//5. Iterate over valuesIterator<String> itr = LinkedHashSet.iterator();while(itr.hasNext()){String value = itr.next();System.out.println("Value: " + value);}

Вывод программы.

[A, B, C, D, E]trueValue: AValue: BValue: CValue: E

5.2. Пример преобразования LinkedHashSet в массив

Пример Java для преобразования LinkedHashSet в массив с помощью метода toArrray().

LinkedHashSet<String> LinkedHashSet = new LinkedHashSet<>();LinkedHashSet.add("A");LinkedHashSet.add("B");LinkedHashSet.add("C");LinkedHashSet.add("D");LinkedHashSet.add("E");String[] values = new String[LinkedHashSet.size()];LinkedHashSet.toArray(values);System.out.println(Arrays.toString(values));

Вывод программы.

[A, B, C, D, E]

5.3 Пример преобразования LinkedHashSet в ArrayList

Пример Java для преобразования LinkedHashSet в arraylist с использованием API потока Java 8.

LinkedHashSet<String> LinkedHashSet = new LinkedHashSet<>();LinkedHashSet.add("A");LinkedHashSet.add("B");LinkedHashSet.add("C");LinkedHashSet.add("D");LinkedHashSet.add("E");List<String> valuesList = LinkedHashSet.stream().collect(Collectors.toList());System.out.println(valuesList);

Вывод программы.

[A, B, C, D, E]

 

6. Варианты использования LinkedHashSet

LinkedHashSet очень похож на ArrayList(упорядоченный) и HashSet(уникальные элементы). Он дополнительно гарантирует порядок итерации элементов(в порядке вставки элементов).

Реальным вариантом использования LinkedHashSet может быть хранение данных из потока, где поток может содержать дублирующиеся записи в желаемом порядке, а нас интересуют только отдельные записи, но в точно таком же порядке.

Другим вариантом использования может быть поиск отдельных слов в заданном предложении, при этом порядок слов должен быть зафиксирован по мере их появления в предложении.

 

7. Производительность LinkedHashSet

  • Класс LinkedHashSet обеспечивает постоянную производительность O(1) для основных операций(добавление, удаление, содержание и размер), предполагая, что хэш-функция правильно распределяет элементы по контейнерам.
  • Производительность, скорее всего, будет немного ниже, чем у HashSet, из-за дополнительных расходов на поддержание связанного списка, за исключением итерации.Итерация по LinkedHashSet требует времени, пропорционального размеру набора, независимо от его емкости. Итерация по HashSet, вероятно, будет более затратной, требуя времени, пропорционального его емкости. Таким образом, LinkedHashSet может обеспечить лучшую производительность, чем HashSet во время итерации.

 

8. Заключение

Из вышеизложенного обсуждения очевидно, что LinkedHashSet — очень полезный класс коллекции в случаях, когда мы хотим обрабатывать дубликаты записей в некотором фиксированном порядке. Он обеспечивает предсказуемую производительность для базовых операций.

Если порядок итерации элементов не нужен, то рекомендуется использовать более легкие HashSet и HashMap.

Пишите мне в комментариях ваши вопросы, связанные с LinkedHashSet в Java.

Ссылка:

Документация Java LinkedHashSet

Прокрутить вверх