JJava 知识库
JAVA INTERVIEW

高频面试题

Java集合基础约 2 分钟

业务需要同时做到去重、保留插入顺序和按规则排序,你会怎么选择 Set 的实现?

参考回答约 2 分钟 · 口语表达
我的判断

去重、保留原顺序和按规则排序不是一个 Set 同时完成的三个开关,先明确最终输出语义,再组合最合适的数据结构。

如果要求“第一次出现的顺序保留,同时去重”,直接用 LinkedHashSet。如果最终只关心排序后的唯一结果,可以用带 Comparator 的 TreeSet,但要非常小心:Comparator 返回 0 就会被认为是同一个元素,它表达的是去重规则,不只是显示顺序。

运营常见需求其实是:按订单号去重,保留一条记录,然后按金额或时间展示。我不会用一个 TreeSet 硬做,而是先用明确业务键放进 LinkedHashMap<OrderKey, Order>,决定重复时保留第一条还是最后一条,再把 values 放进 List 排序。

Map<OrderKey, Order> unique = new LinkedHashMap<>();
orders.forEach(o -> unique.putIfAbsent(keyOf(o), o));
List<Order> result = new ArrayList<>(unique.values());
result.sort(orderComparator);

这样去重语义和排序语义分开,需求变化时不会互相影响。