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的示例使用哈希集。