Java 从哈希集中删除元素

Java 从哈希集中删除元素,java,hashset,Java,Hashset,我有密码: System.out.println("before: " + clusters.size()); Iterator it = clusters.iterator(); while (it.hasNext()) { Set<Place> set = (Set<Place>) it.next(); if (set == max2) { System.

我有密码:

System.out.println("before: " + clusters.size());

        Iterator it = clusters.iterator();
        while (it.hasNext()) {
            Set<Place> set = (Set<Place>) it.next();
            if (set == max2) {
                System.out
                        .println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                it.remove();
                break;
            }
        }

        System.out.println("after: " + clusters.size());
怎么可能呢?

关于迭代器。删除():
从基础集合中移除迭代器返回的最后一个元素(可选操作)。每次调用next时只能调用此方法一次。如果在迭代过程中以任何方式修改了基础集合,而不是调用此方法,则迭代器的行为是未指定的。

虽然您的代码应该(直观地)工作,但您遇到了集合设计方式的限制。集合的散列是其项的所有散列的总和,并且散列集合的项必须具有一致的散列,否则在查找期间无法找到它们。您使用的是一组集合,我相信您在子集合位于集合中时修改了它们,因此现在无法找到它们来删除它们。这是一个未定义的行为领域,因此您可能会发现,在针对标准库的不同版本和实现进行编译时,它的行为有所不同

您最好使用键->集的地图。通常,请记住,在将项添加到集合(或将其用作映射中的键)后,不应执行任何会更改其哈希的操作(当然,这适用于最常见的
HashSet
s和
HashMap
s。对于其他类型,请遵循文档中给出的特定规则,但通常归结为:添加后不要更改)

编辑:看来凯瑟在评论中用他的信息击败了我。哦,好吧


此外,关于使用==而不是
equals
的注释在某种程度上是有效的,但是如果您知道对象肯定是完全相同的引用,那么您的代码就可以了(而且更快!)。从您看到的日志语句来看,情况似乎是这样。

请提供max2和群集的定义。SSCCE会很有帮助:可能是相关的可能重复的@ᴋᴇʏsᴇʀ:也是!!但是谢谢你的链接!你找到了它并帮助我今天早上学到了一些有用的东西,这是你应得的荣誉——谢谢!
before: 96
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
after: 96