Java:将2个相同的对象添加到Set后,它包含2个元素

Nic*_*oul 6 java equals set hashcode

将两个相同的对象添加到Set后,我希望该集合只包含一个元素.

public void addIdenticalObjectsToSet(){
    Set<Foo> set = new HashSet<Foo>();
    set.add(new Foo("totoro"));
    set.add(new Foo("totoro"));
    Assert.assertEquals(1, set.size());            // PROBLEM: SIZE=2
}

private class Foo {
    private String id;
    public Foo(String id) {
        this.id = id;
    }
    public String getId() {
        return id;
    }
    public boolean equals(Object obj) {
        return obj!= null && obj instanceof Foo &&
            ((Foo)obj).getId().equals(this.getId());
    }
    public int hashcode() {
        return this.getId().hashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它们具有相同的id(String),我认为两个对象是相同的.

其他奇怪的事情:就我所知,使用调试/断点都不会访问Foo.equals和Foo.hashcode.我错过了什么?

Thi*_*ilo 15

public int hashcode() {
        return this.getId().hashCode();
    }
Run Code Online (Sandbox Code Playgroud)

应该

@Override
public int hashCode() {
        return this.getId().hashCode();
    }
Run Code Online (Sandbox Code Playgroud)

注释会告诉你有关拼写错误的信息.

IDE中的方法中还应该有一个(缺少的)小三角符号,用于指示是否正在实现接口或是否覆盖父方法.