English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本教程中,我们将借助示例学习Java LinkedHashSet类及其方法。
Java集合框架的LinkedHashSet类提供了哈希表和链接列表数据结构的功能。
它实现Set接口。
LinkedHashSet的元素存储在类似于HashSet的哈希表中。
但是,链表哈希集合在内部为其所有元素维护一个双链表。链表定义了在哈希表中插入元素的顺序。
为了创建链表的哈希集,我们必须首先导入java.util.LinkedHashSet包。
导入包后,就可以在Java中创建链表的哈希集。
// 具有8个容量和0.75负载因子的LinkedHashSet LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);
在这里,我们创建了一个名为numbers的链表哈希集合。
注意,语句 new LinkedHashSet<>(8, 0.75)。在这里,第一个参数是容量,第二个参数是负载因子。
capacity - 该哈希集的容量为8。意味着,它可以存储8个元素。
loadFactor- 此哈希集的负载因子为0.6。这意味着,只要我们的哈希表填充了60%,元素就会移动到新哈希表中,该哈希表的大小是原始哈希表的两倍。
默认容量和负载因子
可以在不定义其容量和负载因子的情况下创建链表的哈希集合。例如,
// 具有默认容量和负载因子的LinkedHashSet LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
默认,
链接哈希集的容量将为16
负载因子将为0.75
这是我们如何创建包含其他集合的所有元素的链接哈希集。
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); //从ArrayList创建LinkedHashSet LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers); System.out.println("LinkedHashSet: " + numbers); } }
Результат вывода
ArrayList: [2, 4] LinkedHashSet: [2, 4]
LinkedHashSet类提供了让我们对所链表的哈希集合执行各种操作方法。
add() - 将指定的元素插入链表的哈希集
addAll() - 将指定集合的所有元素插入链表的哈希集
Например,
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]
Чтобы访问链表的哈希集的元素,我们可以使用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("Использование Iterator в LinkedHashSet: "); //Аccess element while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Результат вывода
LinkedHashSet: [2, 5, 6] Использование LinkedHashSet с Iterator: 2, 5, 6,
Внимание:
hasNext() возвращает true, если в хеш-списке существует следующий элемент
next() возвращает следующий элемент из хеш-списка
remove() - Удаляет указанный элемент из хеш-списка
removeAll() - Удаляет все элементы из хеш-списка
Например,
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("Удалили 5? " + value1); boolean value2 = numbers.removeAll(numbers); System.out.println("Удалили все элементы? " + value2); } }
Результат вывода
LinkedHashSet: [2, 5, 6] Удалили 5? true Удалили все элементы? true
Методы класса LinkedHashSet также могут использоваться для выполнения различных операций над множеством.
Чтобы выполнить объединение двух множеств, мы можем использовать метод 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("Объединение множеств: " + numbers); } }
Результат вывода
LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] Объединение множеств: [1, 3, 2, 4]
Чтобы выполнить объединение двух множеств, мы можем использовать метод 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("Объединение множеств: " + evenNumbers); } }
Результат вывода
LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] Объединение множеств: [2]
Чтобы вычислить разность между двумя множествами, мы можем использовать метод 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("Разность множеств: " + primeNumbers); } }
Результат вывода
LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] Разность множеств: [2]
Чтобы проверить, является ли один набор подмножеством другого, мы можем использовать метод 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("LinkedHashSet2 является подмножеством LinkedHashSet1? " + result); } }
Результат вывода
LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] Is LinkedHashSet2 подмножеством LinkedHashSet1? true
Метод | Описание |
---|---|
clone() | Создание дубликата LinkedHashSet |
contains() | Поиск указанного элемента в LinkedHashSet и возврат булевого результата |
isEmpty() | Проверка, пуст ли LinkedHashSet |
size() | Возврат размера LinkedHashSet |
clear() | Удаление всех элементов из LinkedHashSet |
LinkedHashSet и HashSet оба реализуют интерфейс Set. Однако, между ними есть некоторые различия.
LinkedHashSet внутренне поддерживает цепочку. Таким образом, он поддерживает порядок вставки своих элементов.
LinkedHashSet требует больше места для хранения, чем HashSet. Это связано с тем, что LinkedHashSet внутренне поддерживает цепочку.
Производительность LinkedHashSet медленнее, чем HashSet. Это связано с наличием в LinkedHashSet цепочки.
Ниже приведены основные различия между LinkedHashSet и TreeSet:
TreeSet класс реализует интерфейс SortedSet. Это означает, что элементы в наборе имеют упорядоченный вид. Однако, LinkedHashSet класс поддерживает только порядок вставки своих элементов.
TreeSet обычно медленнее, чем LinkedHashSet. Это связано с тем, что каждый раз, когда элемент добавляется в TreeSet, он должен выполнить операцию сортировки.