在Java集合体系中,Set接口的实现类大多不保证元素的存储顺序,而LinkedHashSet是其中的特例,它能够在去重的同时完整保留元素的插入顺序,非常适合需要同时满足去重和顺序要求的场景。

LinkedHashSet的基本特性
LinkedHashSet是Java集合框架中的类,继承自HashSet,同时实现了Set接口。它的内部维护了一个双向链表,这个链表记录了所有元素的插入顺序,因此迭代LinkedHashSet时,元素的返回顺序和插入顺序完全一致。
和普通HashSet相比,LinkedHashSet的增删改查时间复杂度依然是O(1),只是因为需要维护链表,会稍微多占用一点内存空间。它不允许存储重复元素,如果插入已经存在的元素,不会覆盖原有元素,也不会改变原有元素的顺序。
LinkedHashSet的基本用法
创建LinkedHashSet对象
可以通过无参构造或者带初始容量、负载因子的构造方法创建LinkedHashSet实例,示例代码如下:
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetDemo {
public static void main(String[] args) {
// 无参构造,默认初始容量16,负载因子0.75
Set<String> linkedHashSet1 = new LinkedHashSet<>();
// 指定初始容量
Set<String> linkedHashSet2 = new LinkedHashSet<>(20);
// 指定初始容量和负载因子
Set<String> linkedHashSet3 = new LinkedHashSet<>(20, 0.8f);
}
}
添加元素并保持顺序
使用add方法向LinkedHashSet中添加元素,重复元素不会被插入,且所有元素会按照添加的顺序排列:
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetAddDemo {
public static void main(String[] args) {
Set<String> fruitSet = new LinkedHashSet<>();
// 按顺序添加元素
fruitSet.add("苹果");
fruitSet.add("香蕉");
fruitSet.add("橙子");
// 添加重复元素,不会生效,顺序也不会改变
fruitSet.add("苹果");
// 迭代输出,顺序和插入顺序一致
for (String fruit : fruitSet) {
System.out.println(fruit);
}
// 输出结果:
// 苹果
// 香蕉
// 橙子
}
}
常用操作方法
LinkedHashSet支持Set接口的所有常用操作,比如删除元素、判断元素是否存在、清空集合等,示例如下:
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetOperationDemo {
public static void main(String[] args) {
Set<Integer> numSet = new LinkedHashSet<>();
// 添加元素
numSet.add(10);
numSet.add(20);
numSet.add(30);
// 判断元素是否存在
System.out.println("是否包含20:" + numSet.contains(20)); // 输出true
// 删除元素
numSet.remove(20);
System.out.println("删除20后是否包含20:" + numSet.contains(20)); // 输出false
// 获取集合大小
System.out.println("集合大小:" + numSet.size()); // 输出2
// 清空集合
numSet.clear();
System.out.println("清空后集合大小:" + numSet.size()); // 输出0
}
}
LinkedHashSet与常见Set集合的区别
为了更清晰地理解LinkedHashSet的定位,我们将它和HashSet、TreeSet做一个对比:
| 集合类型 | 是否去重 | 是否保证顺序 | 顺序类型 | 底层结构 |
|---|---|---|---|---|
| HashSet | 是 | 否 | 无 | 哈希表 |
| LinkedHashSet | 是 | 是 | 插入顺序 | 哈希表+双向链表 |
| TreeSet | 是 | 是 | 自然顺序或自定义排序 | 红黑树 |
使用场景与注意事项
LinkedHashSet适合用在需要去重且需要保留元素插入顺序的场景,比如记录用户的操作日志、维护访问顺序的缓存列表等。使用时需要注意以下几点:
- LinkedHashSet不是线程安全的,如果在多线程环境下使用,需要手动加锁,或者使用
Collections.synchronizedSet方法包装集合。 - 因为需要维护双向链表,它的性能比HashSet略低,如果不需要顺序要求,优先选择HashSet。
- LinkedHashSet迭代的时候是按照插入顺序遍历,但是如果对集合进行修改操作,比如删除元素,不会影响剩余元素的插入顺序记录。
总结
LinkedHashSet是Java中非常实用的集合类,它在HashSet的基础上增加了维护插入顺序的能力,既满足了Set集合去重的特性,又解决了元素顺序不可控的问题。开发者可以根据实际需求,在HashSet、LinkedHashSet、TreeSet之间灵活选择,让集合的使用更符合业务场景的要求。
LinkedHashSetJava集合插入顺序Set集合修改时间:2026-06-25 11:57:36