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){ ... }