gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:53:20 36 4
gpt4 key购买 nike

我目前正在使用 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) 方法。

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

非常感谢

最佳答案

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

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

关于java.util.HashSet.Contains 测试导致结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722492/

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