Освоение Java LinkedHashSet: особенности, методы и практические примеры
Java LinkedHashSet
В этом руководстве мы изучим класс Java LinkedHashSet и его методы с помощью примеров.
Класс LinkedHashSet из Java Collections Framework предоставляет функциональность как хеш-таблицы, так и связного списка.
Он реализует интерфейс Set.
Элементы LinkedHashSet хранятся в хеш-таблицах, подобно HashSet.
Однако связанные хеш-множества поддерживают двусвязный список внутри для всех своих элементов. Связный список определяет порядок, в котором элементы вставлены в хеш-таблицы.
Создание LinkedHashSet
Для создания linked hash set сначала импортируйте пакет java.util.LinkedHashSet.
После импорта пакета, вот как можно создавать linked hash sets в Java.
// LinkedHashSet с ёмкостью 8 и коэффициентом загрузки 0.75
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);
Здесь мы создали linked hash set с именем numbers.
Обратите внимание, часть new LinkedHashSet<>(8, 0.75). Первый параметр — capacity, второй — loadFactor.
- capacity — ёмкость этого хеш-множества равна 8. То есть, оно может хранить 8 элементов.
- loadFactor — коэффициент загрузки этого хеш-множества 0.6. Это означает, что всякий раз, когда наша хеш-таблица заполнена на 60%, элементы перемещаются в новую хеш-таблицу удвоенного размера.
Значения ёмкости и коэффициента загрузки по умолчанию
Можно создать linked hash set без определения ёмкости и коэффициента загрузки. Например:
// LinkedHashSet с ёмкостью и коэффициентом загрузки по умолчанию
LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
По умолчанию:
- ёмкость linked hash set будет 16
- коэффициент загрузки будет 0.75
Создание LinkedHashSet из других коллекций
Вот как создать linked hash set, содержащий все элементы других коллекций.
import java.util.LinkedHashSet;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
// Создание ArrayList чётных чисел
ArrayList<Integer> evenNumbers = new ArrayList<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("ArrayList: " + evenNumbers);
// Создание LinkedHashSet из ArrayList
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers);
System.out.println("LinkedHashSet: " + numbers);
}
}
Вывод
ArrayList: [2, 4] LinkedHashSet: [2, 4]
Методы LinkedHashSet
Класс LinkedHashSet предоставляет методы, позволяющие выполнять различные операции над linked hash set.
Вставка элементов в LinkedHashSet
add()— вставляет указанный элемент в linked hash setaddAll()— вставляет все элементы указанной коллекции в linked hash set
Например:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>();
// Использование метода add()
evenNumber.add(2);
evenNumber.add(4);
evenNumber.add(6);
System.out.println("LinkedHashSet: " + evenNumber);
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
// Использование метода addAll()
numbers.addAll(evenNumber);
numbers.add(5);
System.out.println("New LinkedHashSet: " + numbers);
}
}
Вывод
LinkedHashSet: [2, 4, 6] New LinkedHashSet: [2, 4, 6, 5]
Доступ к элементам LinkedHashSet
Для доступа к элементам linked hash set можно использовать метод iterator(). Для использования этого метода нужно импортировать пакет java.util.Iterator. Например:
import java.util.LinkedHashSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("LinkedHashSet: " + numbers);
// Вызов метода iterator()
Iterator<Integer> iterate = numbers.iterator();
System.out.print("LinkedHashSet using Iterator: ");
// Доступ к элементам
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Вывод
LinkedHashSet: [2, 5, 6] LinkedHashSet using Iterator: 2, 5, 6,
Примечание:
hasNext()возвращаетtrue, если есть следующий элемент в linked hash setnext()возвращает следующий элемент в linked hash set
Удаление элементов из HashSet
remove()— удаляет указанный элемент из linked hash setremoveAll()— удаляет все элементы из linked hash set
Например:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("LinkedHashSet: " + numbers);
// Использование метода remove()
boolean value1 = numbers.remove(5);
System.out.println("Is 5 removed? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + value2);
}
}
Вывод
LinkedHashSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true
Операции над множествами
Различные методы класса LinkedHashSet можно также использовать для выполнения операций над множествами.
Объединение множеств (Union)
Для выполнения объединения двух множеств можно использовать метод addAll(). Например:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("LinkedHashSet1: " + evenNumbers);
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(1);
numbers.add(3);
System.out.println("LinkedHashSet2: " + numbers);
// Объединение двух множеств
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
Вывод
LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] Union is: [1, 3, 2, 4]
Пересечение множеств (Intersection)
Для выполнения пересечения двух множеств можно использовать метод retainAll(). Например:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("LinkedHashSet1: " + primeNumbers);
LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("LinkedHashSet2: " + evenNumbers);
// Пересечение двух множеств
evenNumbers.retainAll(primeNumbers);
System.out.println("Intersection is: " + evenNumbers);
}
}
Вывод
LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] Intersection is: [2]
Разность множеств (Difference)
Для вычисления разности двух множеств можно использовать метод removeAll(). Например:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
primeNumbers.add(5);
System.out.println("LinkedHashSet1: " + primeNumbers);
LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();
oddNumbers.add(1);
oddNumbers.add(3);
oddNumbers.add(5);
System.out.println("LinkedHashSet2: " + oddNumbers);
// Разность между LinkedHashSet1 и LinkedHashSet2
primeNumbers.removeAll(oddNumbers);
System.out.println("Difference : " + primeNumbers);
}
}
Вывод
LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] Difference: [2]
Подмножество (Subset)
Для проверки, является ли множество подмножеством другого, можно использовать метод containsAll(). Например:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("LinkedHashSet1: " + numbers);
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("LinkedHashSet2: " + primeNumbers);
// Проверка, является ли primeNumbers подмножеством numbers
boolean result = numbers.containsAll(primeNumbers);
System.out.println("Is LinkedHashSet2 is subset of LinkedHashSet1? " + result);
}
}
Вывод
LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] Is LinkedHashSet2 is a subset of LinkedHashSet1? true
Другие методы LinkedHashSet
| Метод | Описание |
|---|---|
clone() | Создаёт копию LinkedHashSet |
contains() | Ищет в LinkedHashSet указанный элемент и возвращает boolean |
isEmpty() | Проверяет, пуст ли LinkedHashSet |
size() | Возвращает размер LinkedHashSet |
clear() | Удаляет все элементы из LinkedHashSet |
Чтобы узнать больше о методах LinkedHashSet, посетите официальную документацию Java LinkedHashSet.
LinkedHashSet против HashSet
Оба LinkedHashSet и HashSet реализуют интерфейс Set. Однако между ними существуют различия.
LinkedHashSetподдерживает связный список внутри. Благодаря этому он сохраняет порядок вставки своих элементов.- Класс
LinkedHashSetтребует больше памяти, чемHashSet. Это потому, чтоLinkedHashSetподдерживает связные списки внутри. - Производительность
LinkedHashSetмедленнее, чемHashSet. Это из-за связных списков вLinkedHashSet.
LinkedHashSet против TreeSet
Вот основные различия между LinkedHashSet и TreeSet:
- Класс
TreeSetреализует интерфейсSortedSet. Поэтому элементы в tree set отсортированы. Однако классLinkedHashSetтолько сохраняет порядок вставки своих элементов. TreeSetобычно медленнееLinkedHashSet. Это потому, что всякий раз, когда элемент добавляется вTreeSet, он должен выполнять операцию сортировки.LinkedHashSetпозволяет вставку null-значений. Однако мы не можем вставить null-значение вTreeSet.
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList