[英]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.