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

时间:2020-04-06 18:54:39

标签: java collections equals contains hashset

我有一个名为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<Record> answer= new HashSet<Record>() 并开始测试

            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

任何帮助您理解问题所在的地方,将不胜感激。

2 个答案:

答案 0 :(得分:1)

尝试也重写hashCode方法。它应该工作。 您可以在此处找到说明: HashSet contains() method

答案 1 :(得分:0)

HashSet依赖于hashCode个相等对象相等的约定。也就是说,如果a.equals(b)返回true,则a.hashCode()必须与b.hashCode()相同

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