【问题标题】:implementing the hashcode of a pojo in an efficient manner in java [duplicate]在java中以有效的方式实现pojo的哈希码[重复]
【发布时间】:2015-07-26 07:49:26
【问题描述】:

在一次采访中,有人要求我以一种有效的方式展示 hashcode 和 equals 方法的实现,所以我构建了下面的 pojo,但面试官说这不是正确和最好的实现,因为它可能导致碰撞,请您告知以下哈希码的实现是否正确

public class Emp  {

    String name, job;
    int salary;

    public Emp(String n, String j, int s) {
        this.name = n;
        this.job = j;
        this.salary = s;

    }

    public int hashcode() {
        return name.hashCode() + job.hashCode() + salary;
    }

    public boolean equals(Object o) {

        Emp e1 = (Emp) o;
        return this.name.equals(e1.name) && this.job.equals(e1.job) && this.salary == e1.salary;
    }
    }

【问题讨论】:

  • 如果这些值之一为空会发生什么?如果传入 equals() 的对象不是 Emp 的实例会怎样?
  • @KevinWorkman 谢谢是的,我同意我没有想到这些情况,你能告诉我如何自己处理这些情况

标签: java hashcode


【解决方案1】:

您正在使用:

  • 两个 String#hashCode 调用,其算法存在争议 - 请参阅 here 以获得有趣的线程
  • 您正在为最后一部分添加薪水(int!!)
  • 最后也是最重要的一点,使用种子:将每个字段乘以一个素数并将结果相加

您可以查看 IDE 如何自动生成哈希码以获得更好的想法。

在 Eclipse 中:

  • 右键单击源(或alt-shift-S
  • Source
  • Generate 'hashCode()' and 'equals()'...

【讨论】:

    【解决方案2】:

    仅仅将hashCode 相加并不是一个好主意。那里有图书馆(例如Project Lombok)可以为您执行此操作。或者您可以简单地请求您的 IDE 生成一个或您。例如Eclipse has an option 用于根据您类中的字段生成 hashCode

    外推一点;假设您有以下hashCodes:

    name.hashCode() = 200
    job.hashCode()  = 400
    salary          = 1000000
    

    但您可能有另一个独特的员工,最终拥有以下hashCodes:

    name.hashCode() = 400
    job.hashCode()  = 200
    salary          = 1000000
    

    如您所见,即使我们在这里有两个不同的员工,我们最终也会得到相同的hashCodehashCode 的一个理想属性是确保您正在散列的实体最终尽可能均匀地分布。

    如果您查看所有“好的”hashCode 实现,您会注意到与素数相乘。这确保了即使所有单个 hashCode 的总和最终相同,您仍然有一个不同的整体 hashCode。你可以用上面的例子试试看。

    【讨论】:

    • 记住,这是一个面试问题,所以面试官会寻找一个简单的解决方案,直接编码。不确定是否需要使用外部库。
    • @AndrewFielden:我后来意识到了这一点,并添加了更多细节。
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 2014-06-24
    • 2012-09-26
    • 2010-11-07
    • 2013-01-25
    • 2021-09-14
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多