温馨提示×

温馨提示×

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

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

java Set为何不能重复

发布时间:2026-09-14 13:48:45 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中,Set 不能存放重复元素,这是由 Set 的接口语义和底层实现机制 共同决定的。下面从「设计目的 → 底层原理 → 常见实现」三个层面说明。


一、Set 的设计语义:数学集合

java.util.Set 在 Java 中的定义就是数学中的集合

  • 集合中不包含重复元素
  • 至多包含一个 null(取决于实现)

所以“不能重复”是 Set 接口本身的规定,而不是某个类特有的行为。

List 允许重复,Map 的 key 不能重复,Set 则整体不允许重复。


二、Set 如何判断“重复”?

Set 判断两个元素是否重复,依靠的是:

e1.equals(e2) == true
并且
e1.hashCode() == e2.hashCode()

关键点

  • 先比较 hashCode()
  • 如果 hashCode 相同,再调用 equals()
  • 只要 equals 返回 true,就认为是同一个元素

⚠️ 如果你重写了 equals(),但没重写 hashCode(),Set 就会“误判”,可能导致看似重复的元素被存进去。


三、常见 Set 实现的底层原理

1️⃣ HashSet(最常用)

new HashSet<>()

底层其实是:

HashMap(key 是 Set 元素,value 是固定空对象)
  • 利用 hashCode + 哈希表
  • 插入时:
    • 计算 hashCode
    • 定位桶位置
    • 若已存在 equals 的元素 → 不插入

✅ 高效(O(1))


2️⃣ TreeSet

new TreeSet<>()
  • 底层是 红黑树
  • 通过 ComparableComparator 判断顺序
  • 如果 compareTo() == 0,就认为重复
a.compareTo(b) == 0  → 视为相同元素

✅ 有序,但稍慢(O(log n))


3️⃣ LinkedHashSet

  • 继承 HashSet
  • 在“不重复”的基础上,维护插入顺序

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

集合 是否允许重复 判断方式
List ✅ 允许 索引
Set ❌ 不允许 equals + hashCode
Map key 不允许重复 equals + hashCode

五、示例说明

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

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

自定义对象示例:

class User {
    String id;
    
    public boolean equals(Object o) {
        return o instanceof User && ((User)o).id.equals(this.id);
    }
    
    public int hashCode() {
        return id.hashCode();
    }
}

六、一句话总结

Java 的 Set 不能重复,是因为它遵循集合语义,并通过 hashCode() + equals()(或比较器)来保证元素的唯一性。

如果你愿意,我也可以帮你分析 为什么你的 Set 里出现了“重复”元素(通常是 hashCode/equals 写错了)。

向AI问一下细节

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

AI