在 Java 中,Set 不能存放重复元素,这是由 Set 的接口语义和底层实现机制 共同决定的。下面从「设计目的 → 底层原理 → 常见实现」三个层面说明。
java.util.Set 在 Java 中的定义就是数学中的集合:
null(取决于实现)所以“不能重复”是 Set 接口本身的规定,而不是某个类特有的行为。
List 允许重复,Map 的 key 不能重复,Set 则整体不允许重复。
Set 判断两个元素是否重复,依靠的是:
e1.equals(e2) == true
并且
e1.hashCode() == e2.hashCode()
equals()⚠️ 如果你重写了 equals(),但没重写 hashCode(),Set 就会“误判”,可能导致看似重复的元素被存进去。
new HashSet<>()
底层其实是:
HashMap(key 是 Set 元素,value 是固定空对象)
✅ 高效(O(1))
new TreeSet<>()
Comparable 或 Comparator 判断顺序compareTo() == 0,就认为重复a.compareTo(b) == 0 → 视为相同元素
✅ 有序,但稍慢(O(log n))
| 集合 | 是否允许重复 | 判断方式 |
|---|---|---|
| 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 写错了)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。