首先,在定义 Java 哈希码之前,我们需要了解什么是哈希以及它的用途。哈希是对某些数据应用哈希函数的过程。哈希函数只是一个数学函数。不用担心不理解!“数学”并不总是意味着“复杂”。这里哈希仅仅表示我们有一些数据和某种规则,将数据映射到一组字符(代码)。
例如,它可以是十六进制密码。我们将一些任意大小的数据作为输入,并对其应用哈希函数。作为输出,我们得到一个固定大小的数据,比如 32 个字符。通常,这种函数会将一大段数据转换为一个小的整数值。该函数工作的结果称为哈希码。
哈希函数广泛用于密码学,还用于其他一些领域。哈希函数可以不同,但它们全都具有特定的属性:
- 特定对象具有特定的哈希码。
- 如果两个对象相等,则它们的哈希码相同。反过来则不正确。
- 如果哈希码不同,则对象肯定不相等。
- 不同的对象可能具有相同的哈希码。不过,这种事可能性极低。如果这样,则会发生冲突,这种情况可能会导致丢失数据。
“合适的”哈希函数会将冲突的概率降至最低。
在 Java 中,哈希函数通常关联 方法。准确地说,将哈希函数应用于 Object 的结果是哈希码。每个 Java 对象都有一个哈希码。一般来说,哈希码是一个由 类的 方法计算出来的数字。通常,程序员会为其对象重写该方法以及与 相关的 方法,以便更高效地处理特定数据。
方法返回一个 int(4 字节)值,它是对象的数字表示。例如,集合使用此哈希码以更有效地存储数据,从而更快地进行访问。
默认情况下,对象的 函数返回存储对象的内存单元的编号。因此,如果未对应用程序代码进行任何更改,则该函数应返回相同的值。如果代码稍有变化,哈希码值也会发生变化。
Java 中使用的哈希码是什么?首先,Java 哈希码助力程序更快运行。例如,如果我们比较某种类型的两个对象 和 ,则运算 所花时间大约是 的 20 倍。
在父类 中,除了 方法之外,还有 ,即用于检查两个对象是否相等的函数。此函数的默认实现只是检查两个对象的链接是否相等。
和 签有合约,所以如果你重写其中一个,则应该重写另外一个,以免破坏这个合约。
现在创建一个类 ,该类带有一个字段 。之后,我们创建 类的两个对象 和 并将它们设置为相同的名称。如果我们使用 类的默认 和 方法,我们肯定会得到不同的,不相等的对象。这就是 Java 中的哈希码的工作原理。这两个对象将具有不同的哈希码,因为它们位于不同的内存单元中, 操作结果将为 false。
运行程序所得的结果如下:控制台中的两个 10 位数字是哈希码。如果我们想要拥有相同名称的相同对象怎么办?我们应该做什么?
答案是:我们应该为 类重写 类的 和 方法。我们可以在 IDEA IDE 中自动完成,只需按键盘上的
alt + insert并选择
Generate -> equals() and hashCode()即可。
通过示例得到下列代码:
运行此代码的结果:
所以现在程序将我们的对象识别为相等并且它们具有相同的哈希码。
你还可以自行创建 和 实现,但要小心并记住尽量减少哈希码冲突。下面是 类中我们自己的 和 方法的示例:
类工作展示:
首先,哈希码助力程序更快运行。例如,如果我们比较某种类型的两个对象 和 ,则运算 所花时间大约是 o1.hashCode() == o2.hashCode() 的 20 倍。在 Java 中,哈希原理支持一些流行的集合,例如 、 和
每个 Java 对象都有从 类继承的 和 方法。要获得良好的工作平等机制,你最好为自己的类重写 和 方法。使用哈希码助力程序更快运行
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/7885.html