[英]Implementation of hashCode and equals of a custom object to use as a key in HashMap
據我所知,如果我們想在HashMap
使用object作為鍵,我們需要實現hashCode
和equals
方法(在該類上)才能正常工作。 但是在下面的代碼中我使用了對象作為鍵,但沒有在Employee
類上實現上面兩個方法,並且它工作正常。
你能否澄清為什么沒有hashCode
和equals
?
public class Employee1 {
Integer Roll;
String Name;
int age;
Employee1(int roll,String name,int Age)
{
this.Roll =roll;
this.Name= name;
this.age =Age;
}
}
public static void main(String ar[]) {
Map<Employee, Integer> ObjectAsKeyMap = new HashMap<Employee, Integer>();
Employee e1 = new Employee(10, "Samad", 30);
Employee e2 = new Employee(50, "Sahar", 20);
ObjectAsKeyMap.put(e1, 10);
ObjectAsKeyMap.put(e2, 20);
if (ObjectAsKeyMap.containsKey(e1))
System.out.println("this Object is already present in HashMap Value="+ObjectAsKeyMap.get(e1));
}
輸出:
this Object is already present in HashMap Value=10
equals(Object o)
的默認實現是this == o
。 由於您使用對象作為鍵,然后使用相同的實例來查詢映射,因此它可以工作。 但是,如果您創建了Employee e3 = new Employee (10, "Samad", 30)
,即使邏輯上它應該等於e1
,它也不會有效,因為您沒有實現hashCode()
和equals(Object)
按要求。
規則不是必須覆蓋equals()
和hashCode()
。 規則是,如果你覆蓋一個,你必須覆蓋另一個。 此外,確保密鑰是不可變的 ,否則如果在添加到地圖后修改密鑰,則無法找到密鑰。
另外一個重要的一點是,您應該使用相同的字段來計算您在equals()
使用的hashCode
。
Object
類中equals()
和hashCode()
的默認實現已經滿足這些方法的約定。
Object的默認equals
方法返回true
(和相同的hashCode
),如果它是相同的對象引用,並且您沒有在Employee
覆蓋它們。 您正在提供與HashMap
已有的對象引用相同的對象引用e1
,因此containsKey(e1)
返回true
。 如果您要創建一個單獨的Employee
對象e3
,其屬性與e1
相同,那么containsKey(e3)
將返回false
除非您在Employee
正確覆蓋equals
和hashCode
。
Object
類已經包含hashCode
和equals
,這些在HashMap
工作正常。 但是,您將獲得的行為是比較同一個對象 ,而不是兩個不同的對象是否相同。
最重要的規則是,如果你這樣做覆蓋equals
,你需要重寫hashCode
,這樣是“平等”的對象有相同hashCode
(這意味着equals
法需要比較所有的字段hashCode
用於構建它的價值) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.