hashCode的实现和自定义对象的equals,用作HashMap中的键

时间:2014-02-19 18:09:37

标签: java dictionary equals hashcode

据我所知,如果我们想在HashMap中使用对象作为键,我们需要实现hashCodeequals方法(在该类上)才能正常工作。但是在下面的代码中我使用了对象作为键,但没有在Employee类上实现上述两种方法,并且它工作正常。

请您澄清一下为什么没有hashCodeequals它才能正常工作?

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

4 个答案:

答案 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中覆盖它们。您提供的相同对象引用e1HashMap中的对象引用相同,因此containsKey(e1)返回true。如果您要使用与Employee相同的属性创建单独的e3对象e1,则containsKey(e3)将返回false,除非您覆盖{{1} }和equals正确地放在hashCode

答案 3 :(得分:1)

班级Object已包含hashCodeequals的实施,这些在HashMap中可以正常使用。但是,您将获得的行为是比较同一个对象,而不是两个不同的对象是否相同。

重要规则是,如果您执行覆盖equals,则需要覆盖hashCode,以便“相等”的对象具有相同的hashCode (这意味着equals方法需要比较hashCode用于构建其值的所有字段。)