java.util.HashSet.Contains测试导致结果不一致

时间:2016-06-09 09:50:21

标签: java contains hashset

我目前正在使用java.util.HashSet来存储一些后引用。在测试类中,我有以下代码:

    System.out.println("==========================================");
    for (Sequence<? extends Item> seq_i: m_sequences_references)
    {
        // Check hashCode
        System.out.println(seq_i.hashCode() == seq.hashCode());

        // Check reflexivity (o == e and e == o)
        System.out.println(seq_i.equals(seq));
        System.out.println(seq.equals(seq_i));

        // Check the default equal 
        System.out.println(seq == seq_i);
    }
    System.out.println(m_sequences_references.contains(seq));
    System.out.println("==========================================");

取得的成果是

==========================================
true
true
true
true
false
==========================================

我没有覆盖任何方法(hashCode,equals),并且检查我没有错误地创建一个equals(AnythingButObject xx)方法。

所以我的问题如下:我知道我做错了什么但我不知道现在要检查什么,你有什么建议吗?

非常感谢

1 个答案:

答案 0 :(得分:4)

您的对象可能是可变的,hashCode()实现依赖于可变字段。首先,您将对象放入集合中,然后修改它以更改其hashCode。但是在HashSet内部,对象仍然存在于旧存储桶中,该数字是从原始hashCode派生的,因此无法找到它。

作为一般规则:永远不要修改HashSet中的对象或用作HashMap键的对象。