原文: https://www.programiz.com/java-programming/linkedhashset

在本教程中,我们将借助示例学习 Java LinkedHashSet类及其方法。

Java 集合框架的LinkedHashSet类提供哈希表和链表数据结构的功能。

它实现了Set接口

Java `LinkedHashSet` - 图1

LinkedHashSet的元素存储在类似于HashSet的哈希表中。

但是,链接哈希集在内部为其所有元素维护一个双链表。 链表定义了在哈希表中插入元素的顺序。


创建一个LinkedHashSet

为了创建链接的哈希集,我们必须首先导入java.util.LinkedHashSet包。

导入包后,就可以在 Java 中创建链接的哈希集。

  1. // LinkedHashSet with 8 capacity and 0.75 load factor
  2. LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);

在这里,我们创建了一个名为number的链接哈希集。

注意,部分new LinkedHashSet<>(8, 0.75)。 在此,第一个参数是capcity,第二个参数是loadFactor

  • capcity - 此哈希集的容量为 8。意味着,它可以存储 8 个元素。
  • loadFactor - 此哈希集的负载因子为 0.6。 这意味着,只要我们的哈希表填充了 60%,元素就会移到新哈希表中,其大小是原始哈希表的两倍。

默认容量和负载系数

无需定义其容量和负载因子就可以创建链接的哈希集。 例如,

  1. // LinkedHashSet with default capacity and load factor
  2. LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();

默认,

  • 链接哈希集的容量将为 16
  • 负载系数将为 0.75

从其他集合创建LinkedHashSet

这是我们如何创建包含其他集合的所有元素的链接哈希集。

  1. import java.util.LinkedHashSet;
  2. import java.util.ArrayList;
  3. class Main {
  4. public static void main(String[] args) {
  5. // Creating an arrayList of even numbers
  6. ArrayList<Integer> evenNumbers = new ArrayList<>();
  7. evenNumbers.add(2);
  8. evenNumbers.add(4);
  9. System.out.println("ArrayList: " + evenNumbers);
  10. // Creating a LinkedHashSet from an ArrayList
  11. LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers);
  12. System.out.println("LinkedHashSet: " + numbers);
  13. }
  14. }

输出

  1. ArrayList: [2, 4]
  2. LinkedHashSet: [2, 4]

LinkedHashSet的方法

LinkedHashSet类提供了一些方法,使我们可以对链接的哈希集执行各种操作。


将元素插入LinkedHashSet

  • add() - 将指定的元素插入链接的哈希集
  • addAll() - 将指定集合的所有元素插入到链接的哈希集中

例如,

  1. import java.util.LinkedHashSet;
  2. class Main {
  3. public static void main(String[] args) {
  4. LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>();
  5. // Using add() method
  6. evenNumber.add(2);
  7. evenNumber.add(4);
  8. evenNumber.add(6);
  9. System.out.println("LinkedHashSet: " + evenNumber);
  10. LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
  11. // Using addAll() method
  12. numbers.addAll(evenNumber);
  13. numbers.add(5);
  14. System.out.println("New LinkedHashSet: " + numbers);
  15. }
  16. }

输出

  1. LinkedHashSet: [2, 4, 6]
  2. New LinkedHashSet: [2, 4, 6, 5]

访问LinkedHashSet元素

要访问链接的哈希集的元素,我们可以使用iterator()方法。 为了使用此方法,我们必须导入java.util.Iterator包。 例如,

  1. import java.util.LinkedHashSet;
  2. import java.util.Iterator;
  3. class Main {
  4. public static void main(String[] args) {
  5. LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
  6. numbers.add(2);
  7. numbers.add(5);
  8. numbers.add(6);
  9. System.out.println("LinkedHashSet: " + numbers);
  10. // Calling the iterator() method
  11. Iterator<Integer> iterate = numbers.iterator();
  12. System.out.print("LinkedHashSet using Iterator: ");
  13. // Accessing elements
  14. while(iterate.hasNext()) {
  15. System.out.print(iterate.next());
  16. System.out.print(", ");
  17. }
  18. }
  19. }

输出

  1. LinkedHashSet: [2, 5, 6]
  2. LinkedHashSet using Iterator: 2, 5, 6,

注意

  • 如果链接的哈希集中存在下一个元素,则hasNext()返回true
  • next()返回链接的哈希集中的下一个元素

HashSet中删除元素

  • remove() - 从链接的哈希集中删除指定的元素
  • removeAll() - 从链接的哈希集中删除所有元素

例如:

  1. import java.util.LinkedHashSet;
  2. class Main {
  3. public static void main(String[] args) {
  4. LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
  5. numbers.add(2);
  6. numbers.add(5);
  7. numbers.add(6);
  8. System.out.println("LinkedHashSet: " + numbers);
  9. // Using the remove() method
  10. boolean value1 = numbers.remove(5);
  11. System.out.println("Is 5 removed? " + value1);
  12. boolean value2 = numbers.removeAll(numbers);
  13. System.out.println("Are all elements removed? " + value2);
  14. }
  15. }

输出

  1. LinkedHashSet: [2, 5, 6]
  2. Is 5 removed? true
  3. Are all elements removed? true

集的操作

LinkedHashSet类的各种方法也可以用于执行各种设置操作。


并集

两个执行两个集合之间的联合,我们可以使用addAll()方法。 例如,

  1. import java.util.LinkedHashSet;
  2. class Main {
  3. public static void main(String[] args) {
  4. LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
  5. evenNumbers.add(2);
  6. evenNumbers.add(4);
  7. System.out.println("LinkedHashSet1: " + evenNumbers);
  8. LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
  9. numbers.add(1);
  10. numbers.add(3);
  11. System.out.println("LinkedHashSet2: " + numbers);
  12. // Union of two set
  13. numbers.addAll(evenNumbers);
  14. System.out.println("Union is: " + numbers);
  15. }
  16. }

输出

  1. LinkedHashSet1: [2, 4]
  2. LinkedHashSet2: [1, 3]
  3. Union is: [1, 3, 2, 4]

交集

要执行两个集合之间的相交,我们可以使用retainAll()方法。 例如

  1. import java.util.LinkedHashSet;
  2. class Main {
  3. public static void main(String[] args) {
  4. LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
  5. primeNumbers.add(2);
  6. primeNumbers.add(3);
  7. System.out.println("LinkedHashSet1: " + primeNumbers);
  8. LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
  9. evenNumbers.add(2);
  10. evenNumbers.add(4);
  11. System.out.println("LinkedHashSet2: " + evenNumbers);
  12. // Intersection of two sets
  13. evenNumbers.retainAll(primeNumbers);
  14. System.out.println("Intersection is: " + evenNumbers);
  15. }
  16. }

输出

  1. LinkedHashSet1: [2, 3]
  2. LinkedHashSet2: [2, 4]
  3. Intersection is: [2]

差集

要计算两组之间的差异,我们可以使用removeAll()方法。 例如,

  1. import java.util.LinkedHashSet;
  2. class Main {
  3. public static void main(String[] args) {
  4. LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
  5. primeNumbers.add(2);
  6. primeNumbers.add(3);
  7. primeNumbers.add(5);
  8. System.out.println("LinkedHashSet1: " + primeNumbers);
  9. LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();
  10. oddNumbers.add(1);
  11. oddNumbers.add(3);
  12. oddNumbers.add(5);
  13. System.out.println("LinkedHashSet2: " + oddNumbers);
  14. // Difference between LinkedHashSet1 and LinkedHashSet2
  15. primeNumbers.removeAll(oddNumbers);
  16. System.out.println("Difference : " + primeNumbers);
  17. }
  18. }

输出

  1. LinkedHashSet1: [2, 3, 5]
  2. LinkedHashSet2: [1, 3, 5]
  3. Difference: [2]

子集

要检查一个集合是否是另一个集合的子集,我们可以使用containsAll()方法。 例如,

  1. import java.util.LinkedHashSet;
  2. class Main {
  3. public static void main(String[] args) {
  4. LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
  5. numbers.add(1);
  6. numbers.add(2);
  7. numbers.add(3);
  8. numbers.add(4);
  9. System.out.println("LinkedHashSet1: " + numbers);
  10. LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
  11. primeNumbers.add(2);
  12. primeNumbers.add(3);
  13. System.out.println("LinkedHashSet2: " + primeNumbers);
  14. // Check if primeNumbers is a subset of numbers
  15. boolean result = numbers.containsAll(primeNumbers);
  16. System.out.println("Is LinkedHashSet2 is subset of LinkedHashSet1? " + result);
  17. }
  18. }

输出

  1. LinkedHashSet1: [1, 2, 3, 4]
  2. LinkedHashSet2: [2, 3]
  3. Is LinkedHashSet2 is a subset of LinkedHashSet1? true

LinkedHashSet的其他方法

方法 描述
clone() 创建LinkedHashSet的副本
contains() LinkedHashSet中搜索指定的元素,并返回布尔结果
isEmpty() 检查LinkedHashSet是否为空
size() 返回LinkedHashSet的大小
clear() LinkedHashSet中删除所有元素

要了解有关LinkedHashSet方法的更多信息,请访问 Java LinkedHashSet(Java 官方文档)


LinkedHashSetHashSet

LinkedHashSetHashSet都实现Set接口。 但是,它们之间存在一些差异。

  • LinkedHashSet在内部维护一个链表。 因此,它保持其元素的插入顺序。
  • LinkedHashSet类比HashSet需要更多的存储空间。 这是因为LinkedHashSet内部维护链表。
  • LinkedHashSet的性能比HashSet慢。 这是因为LinkedHashSet中存在链表。


LinkedHashSetTreeSet

以下是LinkedHashSetTreeSet之间的主要区别:

  • TreeSet类实现SortedSet接口。 这就是对树集中的元素进行排序的原因。 但是,LinkedHashSet类仅维护其元素的插入顺序。
  • TreeSet通常比LinkedHashSet慢。 这是因为每当元素添加到TreeSet时,它都必须执行排序操作。
  • LinkedHashSet允许插入空值。 但是,我们不能向TreeSet插入空值。