我是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;
}
}
输出: 嗨,真的 嗨,真的
非常感谢。
答案 0 :(得分:7)
您没有覆盖hashCode()
。您介绍了另一种名为hashcode()
的方法。案件很重要。
如果您想要覆盖方法,请始终使用@Override注释:
@Override
public int hashcode()
如果你这样做了,编译器就会注意到这个错字并拒绝编译该类。
答案 1 :(得分:1)
您的代码有一个错误的哈希码:写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;
}
}
答案 2 :(得分:0)
如果您正在使用eclipse,您可以使用源代码生成器,避免常见的人为错误(就像您在此处所做的那样。右键单击类 - &gt; source - &gt;生成哈希码和等于方法。它会弹出窗口。在那里你可以选择你需要考虑的等于(对象相等)和哈希码生成的字段。
答案 3 :(得分:0)
Java使用hashCode和equals方法来检查两个对象是否相等。 HashSet在内部使用HashMap。您可以参考HashMap.put(K键,V值)方法获取更多详细信息。