为什么我的Java LinkedHashSet不删除它包含的对象?

为什么我的Java LinkedHashSet不删除它包含的对象?,java,linkedhashset,Java,Linkedhashset,我在LinkedHashSet中有一个对象,它在超类中实现equals、hashCode和compareTo,但当我尝试从集合中删除该对象时。removeobj remove方法返回false,并且该对象保留在集合中。LinkedHashSet的实现是否应该调用其对象的equals方法?因为它没有。这可能是java bug吗?我正在运行1.6.0_25。LinkedHashSet对我来说很好: import java.util.*; public class Test { public

我在LinkedHashSet中有一个对象,它在超类中实现equals、hashCode和compareTo,但当我尝试从集合中删除该对象时。removeobj remove方法返回false,并且该对象保留在集合中。LinkedHashSet的实现是否应该调用其对象的equals方法?因为它没有。这可能是java bug吗?我正在运行1.6.0_25。

LinkedHashSet对我来说很好:

import java.util.*;

public class Test {
    public static void main( String[] args ) {
        LinkedHashSet<String> lhs = new LinkedHashSet<String>();
        String s = "hi";
        lhs.add( s );
        System.out.println( lhs );
        lhs.remove( s );
        System.out.println( lhs );
    }
}
也许您正在将对不同对象的引用传递给remove方法?您确定没有以任何方式更改引用吗


另外,请确保插入hashCode时返回的值与尝试删除hashCode时返回的值相同。

我的猜测是,对象的hashCode实现返回的值与将对象添加到集合时返回的值不同。

这是LinkedHashSet中的错误的可能性非常小。你应该认为这是对你问题的合理解释

假设这是代码中的一个bug,那么它可能是由很多原因造成的。例如:

equals和hashCode方法返回的对象答案相互矛盾。 equals或hashCode方法依赖于可变字段,当对象在集合中时,这些字段将被更改。例如,如果hashcode值更改,则对象可能位于错误的哈希链上,从而导致remove方法找不到它。 您已将equals方法声明为重载,而不是equalsObject的重写。这可以解释为什么你的同龄人没有被称为。。。假设你的断言事实上是正确的。 您试图删除的对象实际上不是您插入的对象。 其他内容已删除该对象。 您正在运行某个类的不同版本,该版本与您正在检查的源代码不匹配。 现在,我知道你已经驳斥了其中的一些解释。但这可能还为时过早。回顾你解雇的证据


您可以使用的另一种方法是使用Java调试器对数据结构(例如LinkedHashSet的内部)进行取证检查,并单步检查应该删除的代码。

而不查看您的代码,我们无法告诉您做错了什么。请在您的网络摄像头前举起一面镜子,以便我可以看到您的代码。哦,把所有的窗户都倒过来,这样我就不用倒着看了。现在我。。。怀疑这是一个Java错误。在这里发布您要删除的对象上的equals和hashCodeTest equals代码,以及您认为应该首先删除的对象。如果它们相等,HashSet将删除元素。更有可能是OP的equals/hash/compare代码有问题。他说他在那个确切的对象上调用了remove。所以我猜他指的是确切的参考或缺乏参考。这就是为什么我们要求查看代码,而不是真正的答案@Dave我的推理是,mekazu说没有调用equals,如果由于散列的变化而没有通过散列找到对象,就不会调用equals。不是说你错了,而是说这还为时过早:可能只是对象的状态也在变化,谁知道呢。@mekazu在Oracle的1.6.025LinkedHashset中,contains和remove最终都将提供的对象的哈希代码映射到数组中的索引。由于多个哈希可以映射到同一个索引,因此将哈希与在其中找到的条目的哈希进行比较,如果哈希相同,则调用equals方法。如果您的对象相等,它们应该返回相同的hashcode,根据hashcode上的javadocs,在对象上的hashcode的javadoc中提到了“注意事项”:[…]多次调用同一对象[…],hashcode方法必须一致地返回相同的整数[…]