Java 面试问题——一组明显重复的问题
在最近的一次采访中,我看到了这段代码Java 面试问题——一组明显重复的问题,java,set,Java,Set,在最近的一次采访中,我看到了这段代码 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.
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。由于集合应该具有唯一的值,有人能解释发生了什么吗?多亏了Slaw的答案-用户不会覆盖equals和hashCode。equals方法的默认实现将比较两个对象的内存地址,hashCode方法的默认实现将是对象的内存地址。当我们创建两个指向不同内存位置的对象时,它们在默认情况下是不同的,除非我们通过重写类的两个方法来定义相等和哈希代码。但是,如果您尝试添加同一实例两次,那么将只向集合中添加一个实例。希望这是清楚的 用户不重写equals和hashCode。通过实现Comparable接口来重写compareTo也是一种很好的做法,因为Treeset不使用equals方法。@javapedia.net只有当对象具有用户可能使用的自然顺序时,才应该实现Comparable。此外,您还可以使用自定义比较器和TreeSet。注意:OP的示例使用哈希集。