第一部分:Java 中的 Equals 方法——最佳实践嗨!我们来谈谈hashCode()Java 中的方法。为什么有必要? 目的完全相同——比较物体。但我们已经有了!为什么要用另一种方法? 答案很简单:提升性能。 一个哈希函数,在 Java 中用equals()hashCode()方法,返回任意对象的固定长度数值。在爪哇语中,hashCode()方法返回一个32位数字(智力)对任何对象。 比较两个数字比用等值()方法,尤其是当该方法考虑多个字段时。 如果我们的程序比较对象,使用哈希码会简单得多。只有当基于hashCode()比较方法是否会继续到等值()方法。 顺便说一句,这就是基于哈希的数据结构的工作原理,比如大家熟悉的! 该方法和方法一样,由开发者覆盖。 而且,和 一样,该方法在 Oracle 文档中有明确的官方要求:HashMaphashCode()equals()equals()hashCode()
如果两个对象相等(即方法返回为真),则它们必须拥有相同的哈希码。equals()
否则,我们的方法就毫无意义了。如上所述,应先进行检定以提升性能。如果哈希码不同,那么检查结果会是假的,尽管根据我们定义的方法,这两个对象实际上相等。hashCode()equals()
如果该方法在同一对象上多次调用,每次都必须返回相同的数字。hashCode()
规则1则不适用于相反方向。两个不同的对象可以使用相同的哈希码。
第三条规则有点让人困惑。这怎么可能? 原因很简单。该方法返回 。 An 是一个 32 位数字。 其数值范围有限:从-2,147,483,648到+2,147,483,647。换句话说,对于一个 ,可能的值刚刚超过40亿个。 现在想象你正在创建一个程序来存储地球上所有居民的数据。每个人对应其自身的对象(类似于类)。 地球上有~75亿人口。 换句话说,无论我们写多么巧妙的算法来将对象转换为整数,我们都没有足够的可能数值。我们只有45亿个可能的智力值,但人数远不止于此。这意味着无论我们多么努力,总会有不同的人拥有相同的哈希码。 当这种情况发生时(两个不同对象的哈希码重合),我们称之为碰撞。 在覆盖该方法时,程序员的目标之一是最小化潜在的碰撞次数。 考虑到这些规则,课程中的方法会是什么样子? 像这样:






