判断集合元素是否相同有四种方法:①Set去重后equals,适合忽略顺序和重复的场景;②双向containsAll,无需额外空间但时间复杂度高;③频次统计比对,严格区分重复次数;④排序后equals,兼顾重复且逻辑直观。

直接看需求:如果只关心“有哪些元素”,不care顺序和重复次数,用 Set 转换后 equals 最稳妥;如果还要保留重复次数(比如 [1,1,2] 和 [1,2,2] 算不同),就得用频次统计或排序比对。
用 Set 去重后比较(推荐多数场景)
适合判断“元素种类是否一致”,自动忽略顺序和重复。原理是把两个集合都转成 HashSet,再调用 equals。
- 代码简洁:new HashSet(list1).equals(new HashSet(list2))
- 性能好:HashSet 的 equals 平均时间复杂度接近 O(n)
- 注意 null:如果集合含 null,且元素类型没重写 equals,可能抛 NullPointerException
- 示例:[a, a, b] 和 [a, b, b] → 都变成 {a, b} → 判定为相同
双向 containsAll(简单但有局限)
调用 col1.containsAll(col2) && col2.containsAll(col1),本质是检查互相包含关系。
- 无需额外空间,原集合即可操作
- 不依赖元素是否可哈希,List、Set 都能用
- 缺点明显:时间复杂度 O(n×m),大数据量时慢;且仍忽略重复次数
- 建议加 size 判断前置优化:大小不同直接返回 false
按元素频次严格比对(需区分重复)
当 [1,1,2] 和 [1,2,2] 必须判为不同,就得统计每个元素出现几次。
立即学习“Java免费学习笔记(深入)”;
- 可用 Apache Commons Collections 的 CollectionUtils.isEqualCollection(),内部用 Map 统计频次
- 自己实现也简单:遍历集合,用 HashMap 记录各元素计数,再逐个比对
- 注意 null 安全:手动处理 null 键,或改用 Guava 的 Multiset
- 性能瓶颈在大数据量:频次统计本身是 O(n),但比对过程要遍历 Map
排序后逐个比较(兼顾重复与顺序无关)
适用于元素可排序、且需保留重复次数但不依赖原始顺序的场景。
- 先转 ArrayList,再用 Collections.sort() 排序(要求元素实现 Comparable 或传 Comparator)
- 排序后调用 List.equals(),天然支持重复和顺序无关的语义
- 时间复杂度 O(n log n),比频次统计略高,但逻辑直观、无第三方依赖
- 示例:[2,1,1] 和 [1,2,1] → 排序后都是 [1,1,2] → 判定为相同


















