温馨提示×

温馨提示×

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

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

Set集合去重原理是啥

发布时间:2026-07-24 12:23:25 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

在 Java 中,Set 集合去重的原理本质上依赖于两个方法:hashCode()equals()。不同实现类(如 HashSetLinkedHashSetTreeSet)在细节上略有差异,但核心思想一致。


一、最常见:HashSet 的去重原理

1️⃣ 核心结论

Set 判断两个元素是否重复,先比较 hashCode(),再比较 equals()

2️⃣ 去重流程(重点)

当你调用:

set.add(obj);

HashSet 内部会做以下事情:

  1. 计算对象的 hashCode
    int hash = obj.hashCode();
    
  2. 根据 hash 找到对应的“桶(bucket)”
  3. 如果该桶里没有元素 → 直接加入
  4. 如果该桶里有元素:
    • equals() 逐个比较
    • 只要有一个 equals 返回 true认为是重复元素,不加入
    • 全部 equals 都返回 false加入

只有 hashCode 相同 且 equals 为 true,才算重复


3️⃣ 为什么要用 hashCode?

  • 提高性能
  • 避免每次都调用 equals() 逐个比较
  • 先快速定位,再精确判断

二、代码示例说明

示例 1:String 的去重(天然支持)

Set<String> set = new HashSet<>();
set.add("abc");
set.add("abc");

System.out.println(set.size()); // 1

原因:

  • String 重写了 hashCode()equals()
  • 内容相同 → hash 相同 → equals true → 去重

示例 2:自定义对象(重点)

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
Set<Person> set = new HashSet<>();
set.add(new Person("张三", 18));
set.add(new Person("张三", 18));

System.out.println(set.size()); // 2 ❌ 没去重

原因:

  • 没重写 hashCode()equals()
  • 默认使用 Object 的方法
  • 比较的是 内存地址

✅ 正确写法(重写 hashCode + equals)

class Person {
    String name;
    int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person p = (Person) o;
        return age == p.age && Objects.equals(name, p.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

此时:

set.size(); // 1 ✅

三、TreeSet 的去重原理(另一种)

TreeSet 不使用 hashCode 和 equals,而是使用:

ComparableComparator

Set<Integer> set = new TreeSet<>();
set.add(3);
set.add(3);

判断重复规则:

  • compareTo() 返回 0 → 认为是相同元素

⚠️ 注意:

  • compareTo() == 0 必须和逻辑相等一致
  • 否则会出现“逻辑相等但没去重”的坑

四、总结对比

Set 类型 去重依据 是否依赖 hashCode
HashSet hashCode + equals ✅ 是
LinkedHashSet hashCode + equals ✅ 是
TreeSet compareTo / compare ❌ 否

五、一句话记忆版 ✅

HashSet 去重:先 hashCode 定位,再 equals 判断;
TreeSet 去重:compareTo 返回 0 就是重复。

如果你愿意,我也可以帮你画一张 HashSet 底层结构图 或结合 面试高频问法 给你总结。

向AI问一下细节

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

AI