Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在集合中重写equals和hashCode_Java_Collections - Fatal编程技术网

Java 在集合中重写equals和hashCode

Java 在集合中重写equals和hashCode,java,collections,Java,Collections,我是Collection的新手,据我所知,我已经重写了Data类中的hashCode()和Equals()方法,但是当我试图搜索元素时,它给出了“not found”。为什么?请查看下面的代码A并帮助我找到错误 import java.util.*; public class WordCounter { public static void main(String args[]) { HashSet<Data> set=new HashSet<Data

我是
Collection
的新手,据我所知,我已经重写了
Data
类中的
hashCode()
Equals()
方法,但是当我试图搜索元素时,它给出了“not found”。为什么?请查看下面的代码A并帮助我找到错误

import java.util.*;

public class WordCounter {
    public static void main(String args[]) {
        HashSet<Data> set=new HashSet<Data>();  
        set.add(new Data("this",2));
        set.add(new Data("that",3));
        set.add(new Data("which",6));
        set.add(new Data("how",7));

        System.out.println(new Data("how",7).hashCode());

        set.add(new Data("hey",3));
        set.add(new Data("me",5));

        Iterator<Data> itr=set.iterator();
        while(itr.hasNext()) {
            Data d=itr.next();
            d.display();
        }
        Data e=new Data("how",7);
        System.out.println(e.hashCode()+"\t");
        if(set.contains(e))
            System.out.println("found");
        else
            System.out.println("not found");

    }
}

也许你的equals方法没有被使用

签名是

public boolean equals(Object obj);
看来你有

public boolean equals(Data e);
当您想要覆盖父方法(在本例中为java.lang.Object)时,请考虑添加
@Override
注释

更新

将方法更改为此可以解决此问题

public boolean equals(Object d) {
    Data e = (Data) d;
    return this.word.equals(e.word) && this.fre == e.fre;
}
您未使用
equals()
方法,因为它的签名错误。正确的签名是
公共布尔等于(对象o){/*…*/}
。由于签名不匹配,因此实际上是重载方法,而不是重写方法。工作
等于()
示例:

@Override
public boolean equals(Object e)
{
    if(!(e instanceof Data)){
        return false;
    }
    Data d = (Data)e;
    return this.word.equals(d.word) && this.fre == d.fre;
}
重写方法时,请使用
@Override
注释-如果签名不匹配,则代码无法编译,因此:

@Override
public boolean equals(Data d){ ... }

将给您一个错误并节省一些调试时间。也可以看看这个。

“也许”。。。?这些都是重载方法,当然它没有使用提供的方法+1对于添加注释,大多数IDE都有添加缺少注释的选项。“但是我使用泛型,当我使用公共布尔等于(objectobj)时,这是一个错误”是的,可能没有,对不起。我只是想向他提出一个他应该问自己的问题。相等(数据)和相等(对象)是不一样的。我认为类数据中没有泛型。我已经在本地测试了你的代码,我可以正确地扩充它。“对不起,我不明白,请你再解释一下,或者给我写一个正确的代码。”
@Override
public boolean equals(Data d){ ... }