gpt4 book ai didi

java - HashSet.remove() 未能按照规范运行?

转载 作者:行者123 更新时间:2023-12-02 05:16:00 30 4
gpt4 key购买 nike

根据 HashSet 的 JDK 文档,remove() :

removes an element e such that (o==null ? e==null : o.equals(e)), if this set contains such an element.

好吧,这里有一小段代码可以证明事实并非如此。 Set 点肯定包含我的点,正如 equals() 所证明的那样,但是,remove() 神秘地未能删除它。问题似乎是由于 point.x 的值发生变化(main() 的第 4 行)造成的。忽略这一点会使一切都按预期运行。

请注意,如果点是 ArrayList 而不是 HashSet,则以下行为正常。

import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.HashSet;

public class RemoveTest2 {

public static void main(final String[] args) {
final Collection<Point2D.Double> points = new HashSet<Point2D.Double>();
final Point2D.Double point = new Point2D.Double();
points.add(point);
point.x++;

// make sure that points definitely contains the point we are trying to remove...
for (final Point2D.Double p : points) {
if (point.equals(p)) {
System.out.println("points definitely contains " + point);
System.out.println(point.hashCode() + " == " + p.hashCode());
}
}

if (!points.remove(point)) {
System.out.println("and yet... failed to remove " + point);
}
System.out.println("points cointains " + points.size());
}

}

该规范似乎非常清晰......请有人向我解释一下我在这里缺少什么。

最佳答案

问题是您在使用对象后更改了该对象的哈希码,因此哈希集无法使用新哈希码获取现有对象(因为它是使用旧哈希码存储的)。

更改此类字段时,需要先删除该对象,然后再更改,然后再次存储。

看看this

关于java - HashSet.remove() 未能按照规范运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26948274/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com