在最近的一次采访中向我展示了此代码。
class User {
private Long id;
private String name;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
Set<User> set = new HashSet<>();
User user = new User();
user.setId(1L);
user.setName("test");
set.add(user);
User user2 = new User();
user2.setId(1L);
user2.setName("test");
set.add(user2);
System.out.println(set.size());
面试官问我要打印出什么尺寸的东西。我回答了1,因为User的两个实例都具有相同的值。但是面试之后,我运行了代码,得到了2。由于集合应该具有唯一的值,有人可以解释发生了什么吗?
答案 0 :(得分:1)
equals()方法的默认实现将比较两个对象的内存地址,hashCode()方法的默认实现将成为对象的内存地址。当我们创建2个指向不同内存位置的对象时,默认情况下它们将是不同的,除非我们通过重写该类的2个方法来定义相等性和哈希码。但是,如果您尝试两次添加同一实例,则只会将一个实例添加到集合中。希望这很清楚。
答案 1 :(得分:0)
感谢Slaw提供的答案-User
不会覆盖equals
和hashCode
。