LinkedHashSet 是 Java 中兼顾去重与插入顺序的高效集合,底层基于 LinkedHashMap 实现,通过哈希表判断重复、双向链表维护添加顺序,支持 O(1) 去重和按插入序遍历,不支持 null,非线程安全。

LinkedHashSet 是 Java 中兼顾去重与插入顺序的高效选择,它底层基于 LinkedHashMap 实现,天然保持元素添加时的顺序,同时保证唯一性。
为什么 LinkedHashSet 能同时解决去重和顺序问题
HashSet 去重但不保序,TreeSet 有序但按自然顺序或比较器排序,不是插入顺序。LinkedHashSet 在哈希表基础上维护了一个双向链表,每次 add() 操作既更新哈希结构,也追加到链表尾部——所以它既像 HashSet 那样 O(1) 时间判断重复,又像 ArrayList 那样记住“谁先来”。
基本用法:声明、添加、遍历
直接使用泛型声明,添加元素自动去重并保留首次出现的顺序:
- 声明:Set<String> set = new LinkedHashSet<>();
- 添加:set.add("apple"); set.add("banana"); set.add("apple"); // 第二个 apple 不生效
- 遍历:for (String s : set) { System.out.println(s); } // 输出 apple、banana(顺序不变)
结合实际场景:处理重复日志或用户操作记录
比如读取一批用户点击行为,要去掉重复 URL,但要按点击时间先后展示:
立即学习“Java免费学习笔记(深入)”;
- 把每条 URL 依次 add 到 LinkedHashSet,重复项自动跳过
- 最后用增强 for 或迭代器遍历,结果就是去重 + 原始时序
- 注意:如果原始数据是 List,也可用 new LinkedHashSet<>(list) 构造,它会按 list 迭代顺序添加并去重
注意事项与常见误区
LinkedHashSet 的“顺序”仅指插入顺序,不是修改顺序;元素本身不可变才能稳定哈希值;它不支持 null 元素(除非显式允许,但一般避免)。
- 不要误以为它能排序(如按字母序),那是 TreeSet 的职责
- 如果需要后续按其他规则排序,应转为 List 后调用 Collections.sort(),而不是依赖 LinkedHashSet
- 多线程环境下不安全,需外部同步或改用 Collections.synchronizedSet(new LinkedHashSet<>())


















