В Java набор проверяет только на равенство объекта с объектами, уже установленными только во время вставки. Это означает, что если после того, как объект уже присутствует в наборе, он становится равным другому объекту в наборе, набор будет содержать оба одинаковых объекта без жалоб.
EDIT: например, рассмотрим простой объект и предположим, что hashCode и equals определены в соответствии с лучшими методами /
class Foo {
int foo;
Foo(int a){ foo = a; }
//+ equals and hashcode based on "foo"
}
Foo foo1 = new Foo(1);
Foo foo2 = new Foo(2);
Set<Foo> set = new HashSet<Foo>();
set.add(foo1);
set.add(foo2);
//Here the set has two unequal elements.
foo2.foo = 1;
//At this point, foo2 is equal to foo1, but is still in the set
//together with foo1.
Как может быть задан класс для изменяемых объектов? Поведение, которое я ожидал, будет следующим: если в любой момент один из объектов в наборе становится равным другому объекту в наборе, этот объект удаляется из набора набором. Уже есть? Есть ли язык программирования, который облегчит выполнение этого?