首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果equals和hashcode在hashmap中比较不同的值怎么办?

如果equals和hashcode在hashmap中比较不同的值怎么办?
EN

Stack Overflow用户
提问于 2015-07-05 11:41:26
回答 3查看 444关注 0票数 0

如果我有一个employee类作为hashMap的键,并且我使用id字段重写employee equals函数,使用name字段重写hashcode函数。会发生什么呢?

EN

Stack Overflow用户

发布于 2015-07-05 16:15:30

以下是一些场景,如果您使用empId覆盖散列代码,则可能会发生这种情况。

注意:下面的hashcode和equals方法的实现是根据问题的需求完成的。

Employee.java

代码语言:javascript
运行
复制
public class Employee {
    private String empId;
    private String empName;

    public Employee(String empId, String empName) {
        super();
        this.empId = empId;
        this.empName = empName;
    }

    @Override
    public int hashCode() {

        return empName.hashCode();
    }

    @Override
    public boolean equals(Object obj) {

        if (obj == null)
            return false;
        Employee employee = (Employee) obj;
        return this.empId.equals(employee.empId);
    }

    @Override
    public String toString() {
        return "Employee [empId=" + empId + ", empName=" + empName + "]";
    }

}

TestHashCode.java

代码语言:javascript
运行
复制
public class TestHashCode {
    public static void main(String[] args) {
        HashMap<Employee, String> map = new HashMap<Employee, String>();

        /**
         * Below two object are unequal by equals method and have same hash
         * code. Both employee1 & employee2 will be stored in same bucket
         * Corresponding to hash code in a linked list.
         */
        Employee employee1 = new Employee("123", "abc");
        Employee employee2 = new Employee("124", "abc");

        map.put(employee1, "abc");
        map.put(employee2, "xyz");
        // output:Collosionresult:abc,xyz
        System.out.println("Collosionresult:" + map.get(employee1) + ","
                + map.get(employee2));

        /**
         * Below two object are equal by equals method and have same hash code.
         * Value will be overridden. Meaning both employee3 & employee4 will get
         * the same value ie. the most recently updated value(world).
         */
        Employee employee3 = new Employee("hello", "pqr");
        Employee employee4 = new Employee("hello", "pqr");
        map.put(employee3, "hello");
        map.put(employee4, "world");
        //Output:OverriddenResult:world,world
        System.out.println("OverriddenResult:" + map.get(employee3) + ","
                + map.get(employee4));          

    }

hashCode的总合同是:

  • 在执行应用程序期间,每当对同一对象多次调用时,hashCode方法必须

始终返回相同的整数,前提是对象上的等于比较中使用的信息未被修改。此整数不需要

从应用程序的一次执行到另一次执行保持一致

执行相同的application.

  • If两个对象根据equals(java.lang.Object)方法是相等的,那么在两个对象上调用hashCode方法必须产生相同的整数结果。

  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在上面调用hashCode方法

这两个对象中的每一个都必须产生不同的整数结果。

但是,程序员应该意识到,生成截然不同的

不相等对象的整数结果可能会提高

哈希表。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31226953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档