在 Java 中,Set 不能存放“相等”的重复元素,但是可以存放不同的对象实例(即使内容相同,只要 equals() 和 hashCode() 认为不相等)。
具体说明如下:
Set 是不包含重复元素的集合。
判断是否重复,依赖元素的:
equals()hashCode()(对 HashSet、LinkedHashSet 等)Set<String> set = new HashSet<>();
set.add(new String("abc"));
set.add(new String("abc"));
System.out.println(set.size()); // 1
虽然是两个 不同的对象实例,但内容相同,equals() 返回 true,所以被视为重复,只保留一个。
Set<Object> set = new HashSet<>();
set.add(new Object());
set.add(new Object());
System.out.println(set.size()); // 2
两个不同的 Object,equals() 默认比较引用,不相等,所以可以放进去。
如果你自定义类但没重写 equals() 和 hashCode():
class User {
String name;
}
Set<User> set = new HashSet<>();
set.add(new User("Tom"));
set.add(new User("Tom"));
// size = 2(被认为是不同元素)
如果重写了:
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { ... }
内容相同的 User 就不能重复放入 Set。
✅ Set 不能放“逻辑上重复”的对象
✅ Set 可以放多个不同的对象实例
❌ 如果你发现“重复对象放进去了”,一般是 equals/hashCode 没写好
如果你愿意,我可以给你画一张 HashSet 去重原理图 或对比 List vs Set。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。