Java: После добавления двух одинаковых объектов в набор, он содержит 2 элемента

После добавления двух одинаковых объектов в набор, я бы ожидал, что набор будет содержать только один элемент.

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 не вызываются, насколько я могу судить, используя debug/breakpoints. Что я упускаю?

6
задан Nicolas Raoul 6 January 2012 в 08:21
поделиться