equals()和contains()看似矛盾

时间:2017-07-27 10:39:12

标签: java collections equality

            for(Context context : contexts) {

                if(context.equals(c)){
                    System.out.println(context.equals(c)+" : "+contexts.contains(c));
                }
            }

上下文是标准的Java TreeSet

对我来说,似乎如果这产生任何输出,它应该产生“true:true”。奇怪的是,它总是以“true:false”回归。

查看文档;我本质上正在复制.contains函数的功能,但却得到了不同的结果。

任何人都能解释一下吗?

编辑:来自java文档(Collection):

  

如果此collection包含指定的元素,则返回true。更正式地,当且仅当此集合包含至少一个元素e时才返回true(o == null?e == null:o.equals(e))。

1 个答案:

答案 0 :(得分:2)

hashcode实施似乎与equals不相符。

contains方法会找到对象 使用hashcode的位置。然后,它会使用equals检查是否

我建议如果你得到true:false,那么你需要修复你的hashcode实施,以便

如果equals为两个对象返回true,则两个对象上的hashcode将返回相同的

使用TreeSet使用compareTo定位 对象所在的位置,并在那里进行等效。