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

时间:2012-01-06 08:21:09

标签: java set equals 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();
    }
}

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

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

1 个答案:

答案 0 :(得分:15)

public int hashcode() {
        return this.getId().hashCode();
    }

应该是

@Override
public int hashCode() {
        return this.getId().hashCode();
    }

注释会告诉你拼写错误。

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