面试问题-一组明显重复

时间:2019-04-02 00:39:54

标签: 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.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。由于集合应该具有唯一的值,有人可以解释发生了什么吗?

2 个答案:

答案 0 :(得分:1)

equals()方法的默认实现将比较两个对象的内存地址,hashCode()方法的默认实现将成为对象的内存地址。当我们创建2个指向不同内存位置的对象时,默认情况下它们将是不同的,除非我们通过重写该类的2个方法来定义相等性和哈希码。但是,如果您尝试两次添加同一实例,则只会将一个实例添加到集合中。希望这很清楚。

答案 1 :(得分:0)

感谢Slaw提供的答案-User不会覆盖equalshashCode