[英]equals method override issue
我是Java的新手。 我为Animal类重写了equals
和hashcode
。 我希望使用HashSet<Animal>
如下所示,仅将一个Animal
插入HashSet
。 但是,尽管具有相同的属性,第二个Animal
对象却被添加到集合中。 有人可以调查吗?
import java.util.*;
class SetTest
{
public static void main(String [] args)
{
Set<Animal>s=new HashSet<Animal>();
Animal a=new Animal(2);
boolean b1=s.add(a);
System.out.println("hi "+b1);
Animal b=new Animal(2);
boolean b2=s.add(b);
System.out.println("hi "+b2);
}
}
class Animal
{
int t;
Animal(int a)
{
t=a;
}
public boolean equals(Object O)
{
if(O instanceof Animal && ((Animal)O).t==t)
return true;
return false;
}
public int hashcode()
{
return t;
}
}
输出:hi true hi true
非常感谢。
您没有覆盖hashCode()
。 您介绍了另一个称为hashcode()
方法。 案件很重要。
当您打算重写方法时,请始终使用@Override批注:
@Override
public int hashcode()
如果您这样做了,编译器会注意到错字,并拒绝编译该类。
您的代码的哈希码类型错误:写hashCode而不是hashcode。
import java.util.*;
class SetTest {
public static void main(String [] args) {
Set<Animal>s=new HashSet<Animal>();
Animal a=new Animal(2);
boolean b1=s.add(a);
System.out.println("hi "+b1);
Animal b=new Animal(2);
boolean b2=s.add(b);
System.out.println("hi "+b2);
}
}
class Animal {
int t;
public Animal(int a) {
t=a;
}
@Override
public boolean equals(Object O) {
return O instanceof Animal
&& ((Animal)O).t==t;
}
@Override
public int hashCode() {
return t;
}
}
如果您使用的是eclipse,则可以使用源代码生成器,并在其中避免常见的人为错误(就像您在此处所做的那样。在类->源->生成哈希码和equals方法上单击鼠标右键。弹出窗口,您可以在其中选择相等(对象相等)和哈希码生成时需要考虑的字段。
Java使用hashCode和equals方法检查两个对象是否相等。 HashSet在内部使用HashMap。 您可以参考HashMap.put(K key,V value)方法以获取更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.