Java 设置 - 更新后删除元素

Java Set - remove element after updating

我有以下代码:

Set<A> aSet = new HashSet<>();
A a1 = new A(); //{1,"1"}
a1.x = 1;
a1.y = "1";
A a2 = new A(); //{1,"2"}
a2.x = 1;
a2.y = "2";

aSet.add(a1);
aSet.add(a2);

a2.y = "1"; // {1,"2"} ---> {1,"1"}

System.out.println(aSet);   //[A{x=1, y="1"}, A{x=1, y="1"}]

//aSet.removeDuplicatesInPlace(); //TODO: is there something like this?

aSet = new HashSet<>(aSet);
System.out.println(aSet);   //[A{x=1, y="1"}]

在这里,我添加了 class A 的 2 个不同元素(这个 class 实现了 equals 和 hashcode 方法)。然后我将 a2 对象上的 y 属性 更改为“1”。这实际上使 Set 在相等方面有 2 个重复元素,但 set 不知道这一点,因为修改是在添加元素后完成的。

删除重复项最简单的方法就是从现有的集合中创建新的集合(如 aSet = new HashSet<>(aSet) 行所做的那样),但我不确定是否有一些集合实现可以更有效地实现它?我可以做的一些实现 aSet.removeDuplicatesInPlace()?

以更改对象 hashCode() 的方式更改存储在 HashSet 中的对象(或者是 HashMap 中的键)是错误的。这样做将导致 contains(object) 为对象的旧值和新值返回 false。有关详细信息,请参阅 Are mutable hashmap keys a dangerous practice?

我认为最好(也是最有效)的方法来完成您想要做的事情:

aSet.remove(a2);
a2.y = "1";
aSet.add(a2); // will not modify the set if an identical object is already present