温馨提示×

温馨提示×

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

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

Set集合为何不能重复

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

Set 集合不能存储重复元素,这是由它的设计目标、底层实现和约定共同决定的。下面从几个层面解释。


一、Set 的设计目标

Set 的语义是**“集合”**(数学中的集合):

集合中的元素是互不相同的。

所以 Set 接口在 Java 等语言中,从语义层面就规定:

  • 不允许重复元素
  • 最多只能有一个 null(部分实现)

二、如何判断“重复”

Set 是否认为两个元素重复,取决于 equals()hashCode()

判断规则(以 Java 为例)

  • 如果 e1.equals(e2) == true,则认为是同一个元素
  • 通常还要求 e1.hashCode() == e2.hashCode()
Set<String> set = new HashSet<>();
set.add("abc");
set.add("abc"); // 不会加入

三、底层实现如何保证不重复

1️⃣ HashSet(最常见)

  • 底层是 HashMap
  • 元素作为 HashMapkey
  • key 本身就不允许重复
// 简化逻辑
map.put(e, PRESENT);

如果 key 已存在,新值不会生效。


2️⃣ TreeSet

  • 底层是 红黑树
  • 使用 ComparableComparator
  • 比较结果为 0 → 认为是相同元素
TreeSet<Integer> set = new TreeSet<>();
set.add(1);
set.add(1); // 不会被加入

3️⃣ LinkedHashSet

  • 继承 HashSet
  • 同样基于 HashMap
  • 只是额外维护插入顺序

四、为什么 List 可以重复,Set 不行?

集合 是否允许重复 是否有序 底层
List ✅ 允许 ✅ 有索引 数组 / 链表
Set ❌ 不允许 ❌/✅ Map / 树
  • List关注顺序和索引
  • Set关注唯一性

五、常见误区

❌ 误区 1:Set 靠“比较地址”去重

✅ 错,是靠 equals() / hashCode() / compareTo()

❌ 误区 2:自定义对象放进 Set 一定不重复

✅ 必须正确重写 equals()hashCode()

class User {
    String id;

    @Override
    public boolean equals(Object o) { ... }

    @Override
    public int hashCode() { ... }
}

六、一句话总结

Set 之所以不能重复,是因为它本身就是“数学集合”的抽象,并通过 equals/hashCode 或比较器,在底层数据结构(Map / 红黑树)中强制保证唯一性。

如果你愿意,我也可以结合 源码(HashSet / HashMap)面试角度 再给你讲一版。

向AI问一下细节

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

AI