ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Java `LinkedHashSet` > 原文: [https://www.programiz.com/java-programming/linkedhashset](https://www.programiz.com/java-programming/linkedhashset) #### 在本教程中,我们将借助示例学习 Java `LinkedHashSet`类及其方法。 Java 集合框架的`LinkedHashSet`类提供哈希表和链表数据结构的功能。 它实现了[`Set`接口](/java-programming/set "Java Set Interface")。 ![Java LinkedHastSet class implements the Set interface.](https://img.kancloud.cn/76/91/76919e3ed606516646772eb50a5256bd_396x558.png) `LinkedHashSet`的元素存储在类似于[`HashSet`](/java-programming/hashset "Java HashSet Class")的哈希表中。 但是,链接哈希集在内部为其所有元素维护一个双链表。 链表定义了在哈希表中插入元素的顺序。 * * * ## 创建一个`LinkedHashSet` 为了创建链接的哈希集,我们必须首先导入`java.util.LinkedHashSet`包。 导入包后,就可以在 Java 中创建链接的哈希集。 ```java // LinkedHashSet with 8 capacity and 0.75 load factor LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75); ``` 在这里,我们创建了一个名为`number`的链接哈希集。 注意,部分`new LinkedHashSet<>(8, 0.75)`。 在此,第一个参数是`capcity`,第二个参数是`loadFactor`。 * **`capcity`** - 此哈希集的容量为 8。意味着,它可以存储 8 个元素。 * **`loadFactor`** - 此哈希集的负载因子为 0.6。 这意味着,只要我们的哈希表填充了 60%,元素就会移到新哈希表中,其大小是原始哈希表的两倍。 **默认容量和负载系数** 无需定义其容量和负载因子就可以创建链接的哈希集。 例如, ```java // LinkedHashSet with default capacity and load factor LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>(); ``` 默认, * 链接哈希集的容量将为 16 * 负载系数将为 0.75 * * * ## 从其他集合创建`LinkedHashSet` 这是我们如何创建包含其他集合的所有元素的链接哈希集。 ```java import java.util.LinkedHashSet; import java.util.ArrayList; class Main { public static void main(String[] args) { // Creating an arrayList of even numbers ArrayList<Integer> evenNumbers = new ArrayList<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("ArrayList: " + evenNumbers); // Creating a LinkedHashSet from an ArrayList LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers); System.out.println("LinkedHashSet: " + numbers); } } ``` **输出** ```java ArrayList: [2, 4] LinkedHashSet: [2, 4] ``` * * * ## `LinkedHashSet`的方法 `LinkedHashSet`类提供了一些方法,使我们可以对链接的哈希集执行各种操作。 * * * ## 将元素插入`LinkedHashSet` * `add()` - 将指定的元素插入链接的哈希集 * `addAll()` - 将指定集合的​​所有元素插入到链接的哈希集中 例如, ```java import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>(); // Using add() method evenNumber.add(2); evenNumber.add(4); evenNumber.add(6); System.out.println("LinkedHashSet: " + evenNumber); LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); // Using addAll() method numbers.addAll(evenNumber); numbers.add(5); System.out.println("New LinkedHashSet: " + numbers); } } ``` **输出**: ```java LinkedHashSet: [2, 4, 6] New LinkedHashSet: [2, 4, 6, 5] ``` * * * ## 访问`LinkedHashSet`元素 要访问链接的哈希集的元素,我们可以使用`iterator()`方法。 为了使用此方法,我们必须导入`java.util.Iterator`包。 例如, ```java 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); // Calling the iterator() method Iterator<Integer> iterate = numbers.iterator(); System.out.print("LinkedHashSet using Iterator: "); // Accessing elements while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } } ``` **输出**: ```java LinkedHashSet: [2, 5, 6] LinkedHashSet using Iterator: 2, 5, 6, ``` **注意**: * 如果链接的哈希集中存在下一个元素,则`hasNext()`返回`true` * `next()`返回链接的哈希集中的下一个元素 * * * ## 从`HashSet`中删除元素 * `remove()` - 从链接的哈希集中删除指定的元素 * `removeAll()` - 从链接的哈希集中删除所有元素 例如: ```java 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); // Using the remove() method 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); } } ``` **输出**: ```java LinkedHashSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true ``` * * * ## 集的操作 `LinkedHashSet`类的各种方法也可以用于执行各种设置操作。 * * * ### 并集 两个执行两个集合之间的联合,我们可以使用`addAll()`方法。 例如, ```java 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); // Union of two set numbers.addAll(evenNumbers); System.out.println("Union is: " + numbers); } } ``` **输出**: ```java LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] Union is: [1, 3, 2, 4] ``` * * * ### 交集 要执行两个集合之间的相交,我们可以使用`retainAll()`方法。 例如 ```java 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); // Intersection of two sets evenNumbers.retainAll(primeNumbers); System.out.println("Intersection is: " + evenNumbers); } } ``` **输出**: ```java LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] Intersection is: [2] ``` * * * ### 差集 要计算两组之间的差异,我们可以使用`removeAll()`方法。 例如, ```java 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); // Difference between LinkedHashSet1 and LinkedHashSet2 primeNumbers.removeAll(oddNumbers); System.out.println("Difference : " + primeNumbers); } } ``` **输出**: ```java LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] Difference: [2] ``` * * * ### 子集 要检查一个集合是否是另一个集合的子集,我们可以使用`containsAll()`方法。 例如, ```java 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); // Check if primeNumbers is a subset of numbers boolean result = numbers.containsAll(primeNumbers); System.out.println("Is LinkedHashSet2 is subset of LinkedHashSet1? " + result); } } ``` **输出**: ```java LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] Is LinkedHashSet2 is a subset of LinkedHashSet1? true ``` * * * ## `LinkedHashSet`的其他方法 | 方法 | 描述 | | --- | --- | | `clone()` | 创建`LinkedHashSet`的副本 | | `contains()` | 在`LinkedHashSet`中搜索指定的元素,并返回布尔结果 | | `isEmpty()` | 检查`LinkedHashSet`是否为空 | | `size()` | 返回`LinkedHashSet`的大小 | | `clear()` | 从`LinkedHashSet`中删除所有元素 | 要了解有关`LinkedHashSet`方法的更多信息,请访问 [Java `LinkedHashSet`(Java 官方文档)](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html)。 * * * ## `LinkedHashSet`与`HashSet` `LinkedHashSet`和`HashSet`都实现`Set`接口。 但是,它们之间存在一些差异。 * `LinkedHashSet`在内部维护一个链表。 因此,它保持其元素的插入顺序。 * `LinkedHashSet`类比`HashSet`需要更多的存储空间。 这是因为`LinkedHashSet`内部维护链表。 * `LinkedHashSet`的性能比`HashSet`慢。 这是因为`LinkedHashSet`中存在链表。 * * * * * * ## `LinkedHashSet`与`TreeSet` 以下是`LinkedHashSet`和`TreeSet`之间的主要区别: * `TreeSet`类实现`SortedSet`接口。 这就是对树集中的元素进行排序的原因。 但是,`LinkedHashSet`类仅维护其元素的插入顺序。 * `TreeSet`通常比`LinkedHashSet`慢。 这是因为每当元素添加到`TreeSet`时,它都必须执行排序操作。 * <random>`LinkedHashSet`允许插入空值。 但是,我们不能向`TreeSet`插入空值。</random>