Set相等判断用equals()方法,要求元素完全相同且数量一致,不考虑顺序和底层实现;需确保元素正确重写equals()和hashCode(),否则语义错误。

Java 中 Set 判断两个集合是否相等,用的是 equals() 方法,核心规则是:两个 Set 相等当且仅当它们包含完全相同的元素(不考虑顺序,也不关心底层实现)。这和 List 的相等判断不同——List 要求元素顺序也一致。
Set.equals() 的实际比较逻辑
调用 set1.equals(set2) 时,JDK 内部会做以下检查:
- 先判断引用是否相同(同一对象),是则直接返回
true - 再判断
set2是否为null或非Set类型,是则返回false - 接着比较大小:如果
size()不同,直接返回false - 最后遍历
set1中每个元素,检查是否都contains()在set2中(依赖元素自身的equals()和hashCode())
关键前提:元素必须正确重写 equals() 和 hashCode()
Set 依赖元素的 equals() 判断“内容是否相同”,而 hashCode() 影响哈希类 Set(如 HashSet)的存储与查找效率。若没重写,将使用默认的内存地址比较,导致语义错误。
例如:
立即学习“Java免费学习笔记(深入)”;
class Person { String name; int age; } // 没重写 equals/hashCode即使两个 Person("Alice", 25) 内容一样,new Person("Alice",25).equals(new Person("Alice",25)) 仍为 false,那么它们在 Set 中会被视为不同元素,equals() 比较也会失败。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
不同 Set 实现的行为一致
无论你用的是 HashSet、TreeSet 还是 LinkedHashSet,只要它们实现了 Set 接口,equals() 行为完全一致——只看元素内容和数量,不看顺序、排序方式或插入顺序。
比如:
-
new HashSet(Arrays.asList(1,2,3)).equals(new TreeSet(Arrays.asList(3,2,1)))→true -
new LinkedHashSet(Arrays.asList(1,2,3)).equals(new HashSet(Arrays.asList(1,2,3,4)))→false(大小不同)
注意:== 和 Collections.disjoint() 不是用来判断相等的
== 只比引用,几乎从不适用于 Set 相等判断;Collections.disjoint(a,b) 是判断“是否完全没有交集”,和“是否相等”是相反的逻辑。别混淆。
如果需要严格按插入顺序判断(比如想区分 [1,2,3] 和 [3,2,1]),那就不能用 Set,该换用 List 或自定义逻辑。
基本上就这些。Set 相等判断不复杂但容易忽略元素的 equals/hashCode 正确性,写业务代码时务必检查。
















