温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Set如何判断相等

发布时间:2026-10-25 19:25:29 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

在 Java 中,Set 判断“相等(是否包含某个元素 / 两个 Set 是否相等)”依赖于 equals() 和 hashCode() 方法,具体分两种情况来看:


一、Set 中“元素是否相等”(判断能否添加 / 是否包含)

当你向 Set 添加元素或调用 contains() 时:

set.add(obj);
set.contains(obj);

判断逻辑(以 HashSet 为例):

  1. 先比较 hashCode()
    • 如果 hashCode 不同 → 直接认为不相等
  2. 如果 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 之间是否“相等”

Set 本身也实现了 equals():

set1.equals(set2)

判断规则:

  • 元素个数相同
  • 每个元素在另一个 Set 中都存在(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 实现的细节差异

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、去重逻辑),我可以给你更针对性的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手