Set 集合不能存储重复元素,这是由它的设计目标、底层实现和约定共同决定的。下面从几个层面解释。
Set 的语义是**“集合”**(数学中的集合):
集合中的元素是互不相同的。
所以 Set 接口在 Java 等语言中,从语义层面就规定:
null(部分实现)Set 是否认为两个元素重复,取决于 equals() 和 hashCode()。
e1.equals(e2) == true,则认为是同一个元素e1.hashCode() == e2.hashCode()Set<String> set = new HashSet<>();
set.add("abc");
set.add("abc"); // 不会加入
HashMap 的 key// 简化逻辑
map.put(e, PRESENT);
如果 key 已存在,新值不会生效。
Comparable 或 Comparator0 → 认为是相同元素TreeSet<Integer> set = new TreeSet<>();
set.add(1);
set.add(1); // 不会被加入
HashSetHashMap| 集合 | 是否允许重复 | 是否有序 | 底层 |
|---|---|---|---|
| List | ✅ 允许 | ✅ 有索引 | 数组 / 链表 |
| Set | ❌ 不允许 | ❌/✅ | Map / 树 |
List:关注顺序和索引Set:关注唯一性✅ 错,是靠 equals() / hashCode() / compareTo()
✅ 必须正确重写 equals() 和 hashCode()
class User {
String id;
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { ... }
}
Set 之所以不能重复,是因为它本身就是“数学集合”的抽象,并通过
equals/hashCode或比较器,在底层数据结构(Map / 红黑树)中强制保证唯一性。
如果你愿意,我也可以结合 源码(HashSet / HashMap) 或 面试角度 再给你讲一版。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。