Java contains() 方法返回 False,即使重写 equals() 返回 True

Posted

技术标签:

【中文标题】Java contains() 方法返回 False,即使重写 equals() 返回 True【英文标题】:Java contains() method returns False even though overridden equals() returns True 【发布时间】:2020-07-18 20:58:44 【问题描述】:

我有一个名为Record 的对象类,它由Data 类对象的向量组成 对象类Data只有两个变量

Object value;
String name;

我重写Record类中的equals方法如下:

public boolean equals(Object obj) 
    boolean check = true;
    for(int i=0; i<this.coloumnsOfData.size();i++) 
        System.out.println( ((Record) obj).coloumnsOfData.get(i).name + " OBJECT " + ((Record) obj).coloumnsOfData.get(i).value );
        System.out.println( coloumnsOfData.get(i).name + " THIS " + coloumnsOfData.get(i).value );
        if( !((((Record) obj).coloumnsOfData.get(i).name).equals(this.coloumnsOfData.get(i).name))   || !((((Record) obj).coloumnsOfData.get(i).value).equals(this.coloumnsOfData.get(i).value))) 

            check=false;
        
    


    return (obj instanceof Record && check);

我初始化 HashSet 如下: Set&lt;Record&gt; answer= new HashSet&lt;Record&gt;() 并开始测试

            Record r1 = new Record();
            r1.coloumnsOfData.add(new Data(new Double( 1.5 ),"gpa"));
            r1.coloumnsOfData.add(new Data(new String("John"),"name"));
            r1.coloumnsOfData.add(new Data(new Integer( 2 ),"id"));

            Record r2 = new Record();
            r2.coloumnsOfData.add(new Data(new Double( 1.5 ),"gpa"));
            r2.coloumnsOfData.add(new Data(new String("John"),"name"));
            r2.coloumnsOfData.add(new Data(new Integer( 2 ),"id"));
            System.out.println(r1.equals(r2)); //RETURNS TRUE
            answer.add(r1);
            System.out.println(answer.contains(r2)); //RETURNS FALSE

任何帮助理解问题所在将不胜感激。

【问题讨论】:

你也覆盖hashCode? @JacobG.No 不,我不是,我不太清楚为什么我应该这样做,或者如何准确地实现它 可能是你的 2 个对象相等,但它们不是同一个实例。 @ThallsEternal 我该如何解决这个问题? obj instanceof Record 应该是要检查的第一个 项,而不是最后一项。最值得注意的是,它应该发生在您执行 (Record) obj 类型转换之前。除此之外,既不使用new Double( 1.5 )new String("John"),也不使用new Integer( 2 )。使用1.5"John"2。实际问题已经解释过了,没有正确的hashCode()实现,你不能使用HashSet 【参考方案1】:

也尝试覆盖 hashCode 方法。它应该工作。 你可以在这里找到解释: HashSet contains() method

【讨论】:

【参考方案2】:

HashSet 依赖于hashCodes 的相等对象相等的契约。也就是说,如果a.equals(b)返回true,那么a.hashCode()必须和b.hashCode()一样

您应该重写 Record 的 hashCode() 方法以在 HashSet 中使用它

【讨论】:

以上是关于Java contains() 方法返回 False,即使重写 equals() 返回 True的主要内容,如果未能解决你的问题,请参考以下文章

Java contains() 方法返回 False,即使重写 equals() 返回 True

java判断包含关系contains方法的使用

java判断包含contains方法的使用

String contains方法

Java Set.contains()方法:判断Set集合是否包含指定的对象

如何在字符串中查找字符串数组?