在 Java 中,Set 判断“相等(是否包含某个元素 / 两个 Set 是否相等)”依赖于 equals() 和 hashCode() 方法,具体分两种情况来看:
当你向 Set 添加元素或调用 contains() 时:
set.add(obj);
set.contains(obj);
判断逻辑(以 HashSet 为例):
hashCode()
hashCode 不同 → 直接认为不相等hashCode 相同 → 再调用 equals()
equals() 返回 true → 认为相等(不再添加 / 认为包含)✅ 所以:
hashCode() 和 equals()equals() 不重写 hashCode(),Set 会失效class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
return name.equals(((Person) o).name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
Set<Person> set = new HashSet<>();
set.add(new Person("Tom"));
System.out.println(set.contains(new Person("Tom"))); // true
Set 本身也实现了 equals():
set1.equals(set2)
判断规则:
equals() 为 true)顺序 不重要
Set<Integer> s1 = Set.of(1, 2, 3);
Set<Integer> s2 = Set.of(3, 2, 1);
System.out.println(s1.equals(s2)); // true
| Set 实现 | 相等判断依据 |
|---|---|
| HashSet | hashCode() + equals() |
| LinkedHashSet | 同 HashSet |
| TreeSet | Comparable.compareTo() 或 Comparator.compare()(不依赖 equals) |
| EnumSet | 枚举常量本身 |
⚠️ TreeSet 特别注意:
compareTo() == 0,就认为是相同元素equals() 返回 false 也会被去重❌ 只重写 equals()
❌ 用可变对象做 Set 元素(改了字段导致 hashCode 变化)
❌ TreeSet 中 compareTo 和 equals 逻辑不一致
如果你有具体场景(比如自定义对象、TreeSet、去重逻辑),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。