精通 Java LinkedHashSet:特性、方法与实战示例
Java LinkedHashSet
本教程通过示例讲解 Java LinkedHashSet 类及其方法。
Java 集合框架中的 LinkedHashSet 类结合了哈希表与链表数据结构的功能。
它实现 Set 接口。

LinkedHashSet 元素存储在类似 HashSet 的哈希表中。
但 LinkedHashSet 内部维护双向链表,链表定义了元素在哈希表中的插入顺序。
创建 LinkedHashSet
先导入 java.util.LinkedHashSet 包。
导入后,可按如下方式创建:
// 容量 8、负载因子 0.75 的 LinkedHashSet
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);
此处创建名为 numbers 的 LinkedHashSet。
注意 new LinkedHashSet<>(8, 0.75)。第一个参数为 capacity,第二个为 loadFactor。
- capacity — 哈希集容量为 8,即可存 8 个元素。
- loadFactor — 负载因子 0.6。当哈希表填充 60% 时,元素移至原表两倍大小的新表。
默认容量与负载因子
也可不指定容量和负载因子创建:
// 默认容量和负载因子的 LinkedHashSet
LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
默认值:
- 容量为 16
- 负载因子为 0.75
从其他集合创建 LinkedHashSet
以下演示如何创建包含其他集合所有元素的 LinkedHashSet。
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 的方法
LinkedHashSet 类提供多种操作方法。
向 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("新 LinkedHashSet: " + numbers);
}
}
输出
LinkedHashSet: [2, 4, 6] 新 LinkedHashSet: [2, 4, 6, 5]
访问 LinkedHashSet 元素
可用 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 迭代: ");
// 访问元素
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
输出
LinkedHashSet: [2, 5, 6] LinkedHashSet 迭代: 2, 5, 6,
注意:
hasNext()有下一元素返回truenext()返回下一元素
从 LinkedHashSet 移除元素
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] LinkedHashSet2 是否为 LinkedHashSet1 子集? true
LinkedHashSet 的其他方法
| 方法 | 说明 |
|---|---|
clone() | 创建 LinkedHashSet 副本 |
contains() | 搜索指定元素,返回布尔结果 |
isEmpty() | 检查 LinkedHashSet 是否为空 |
size() | 返回 LinkedHashSet 大小 |
clear() | 移除所有元素 |
更多 LinkedHashSet 方法请访问 Java LinkedHashSet(官方 Java 文档)。
LinkedHashSet 与 HashSet 对比
两者均实现 Set 接口,但存在差异:
LinkedHashSet内部维护链表,因此保持元素插入顺序。LinkedHashSet比HashSet占用更多存储,因内部维护链表。LinkedHashSet性能比HashSet慢,因链表开销。
LinkedHashSet 与 TreeSet 对比
LinkedHashSet 与 TreeSet 主要差异:
TreeSet实现SortedSet接口,元素有序。LinkedHashSet仅维护插入顺序。TreeSet通常比LinkedHashSet慢,因添加元素需排序。LinkedHashSet允许插入 null 值;TreeSet不允许插入 null。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- Java break 语句:用法、时机与标签 break 详解
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比