据我所知,如果我们想在HashMap
中使用对象作为键,我们需要实现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
答案 0 :(得分:5)
equals(Object o)
的默认实施是this == o
。由于您使用对象作为键,然后使用相同的实例来查询地图,因此它可以正常工作。
但是,如果您创建了Employee e3 = new Employee (10, "Samad", 30)
,即使逻辑上它应该等于e1
,也不会有效,因为您没有按要求实施hashCode()
和equals(Object)
答案 1 :(得分:1)
规则并非您必须同时覆盖equals()
和hashCode()
。规则是,如果你覆盖一个,你必须覆盖另一个。此外,请确保密钥是不可变,否则如果在添加到地图后修改密钥,则无法找到密钥。
同样重要的一点是,您应该使用相同的字段来计算hashCode
中使用的equals()
。
equals()
类中的hashCode()
和Object
的默认实现已经满足这些方法的合同。
答案 2 :(得分:1)
对象的默认equals
方法返回true
(以及相同的hashCode
),如果它是相同的对象引用,并且您没有在Employee
中覆盖它们。您提供的相同对象引用e1
与HashMap
中的对象引用相同,因此containsKey(e1)
返回true
。如果您要使用与Employee
相同的属性创建单独的e3
对象e1
,则containsKey(e3)
将返回false
,除非您覆盖{{1} }和equals
正确地放在hashCode
。
答案 3 :(得分:1)
班级Object
已包含hashCode
和equals
的实施,这些在HashMap
中可以正常使用。但是,您将获得的行为是比较同一个对象,而不是两个不同的对象是否相同。
重要规则是,如果您执行覆盖equals
,则需要覆盖hashCode
,以便“相等”的对象具有相同的hashCode
(这意味着equals
方法需要比较hashCode
用于构建其值的所有字段。)