在 Java 中,Set 判断“相等”其实分两个层面:
Set 依赖元素自身的 equals() 和 hashCode() 来判断两个元素是否相同。
hashCode()equals()Comparator 或元素的 Comparableequals(),而是看 compareTo() == 0Set<String> set = new HashSet<>();
set.add("a");
set.add("a"); // 不会重复
自定义对象示例:
class User {
String id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
return Objects.equals(id, ((User) o).id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
⚠️ 只重写 equals 不重写 hashCode 会导致 HashSet 去重失败
这是 Set 作为集合整体的相等性判断,使用 Set.equals()。
Set<Integer> s1 = Set.of(1, 2, 3);
Set<Integer> s2 = Set.of(3, 2, 1);
System.out.println(s1.equals(s2)); // true
✅ HashSet / TreeSet / LinkedHashSet 都比较元素,不比较顺序
TreeSet<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
set.add("A");
set.add("a"); // 不会添加
因为:
"A".compareToIgnoreCase("a") == 0
⚠️ 即使 equals() 返回 false,TreeSet 也会认为相等
| 场景 | 判断方式 |
|---|---|
| Set 中元素是否重复 | equals() + hashCode()(或 Comparator) |
| 两个 Set 是否相等 | Set.equals()(元素相同即可) |
| TreeSet 元素相等 | compareTo() == 0 |
如果你有具体代码场景(比如自定义对象、TreeSet、并发 Set),我可以帮你针对性分析。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。