LinkedHashSet 是 Java 中兼顾去重与插入顺序的最佳选择,底层基于 LinkedHashMap 实现,通过双向链表维护插入顺序,遍历时按首次添加顺序输出,add() 返回 boolean 表示是否新增成功。
LinkedHashSet 是 Java 中兼顾去重与插入顺序的最佳选择
,它底层基于 LinkedHashMap 实现,既继承了 HashSet 的高效 O(1) 查重能力,又通过双向链表维护元素的插入顺序,天然支持“首次出现优先、重复跳过、顺序不变”的过滤逻辑。
为什么 LinkedHashSet 能严格保持输入顺序?
普通 HashSet 不保证顺序(JDK 8 后是按哈希桶+红黑树结构,遍历时顺序不可预测);而 LinkedHashSet 在每个 Entry 中额外维护了 before/after 引用,形成插入顺序链表。遍历它时,实际是沿链表从前到后访问,因此输出顺序 = 第一次添加该元素时的顺序。
基础用法:一行完成去重+保序
直接将原始集合(如 List)构造为 LinkedHashSet 即可自动过滤重复并保留首次出现位置:
```
java
List
raw = Arrays.asList("a", "b", "c", "b", "a", "d");
SetuniqueOrdered = new LinkedHashSet(raw);
// 结果:[a, b, c, d] —— 重复的 b 和 a 被跳过,顺序由首次出现决定
```
动态添加时仍保持顺序:边加边滤
若需逐个处理流式数据(如循环读取、网络响应),调用
方法即可。它返回 boolean:true 表示新增成功(即此前未存在),false 表示已存在(被忽略):
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
```java
LinkedHashSet
seen = new LinkedHashSet();
for (int x : Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5)) {
seen.add(x); // 自动跳过重复的 1 和 5
}
// 遍历 seen.iterator() 得到:3, 1, 4, 5, 9, 2, 6
```
注意:
不会改变已有元素位置,只在末尾追加新元素;重复元素不插入,也不影响后续顺序。
与 ArrayList + 手动检查对比:更简洁、更安全
有人用 ArrayList 配合
判断去重,但存在两个问题:一是
时间复杂度为 O(n),整体变 O(n²);二是容易误写成每次都在原 list 上查,导致逻辑混乱。LinkedHashSet 把查重和顺序维护封装在一次 add 操作中,语义清晰、性能稳定、线程不安全但单线程下零出错风险。
add()add()contains()contains()