JAVA-初步认识-第十一章-object类-Hashcode方法

一.

除了equals方法外,还有其他的方法可以用。

上图要记住,equals方法不覆盖,也会有,建立对象特有的比较相同的形式,这很重要(语音不清楚,可能写的是错误的)。

我们以前做过这样一件事儿,直接打印对象,

编译的结果是person@61de33,这就是哈希值。这个哈希值是通过哈希算法算出来的,哈希算法到底怎么弄?(打印对象,结果到底指的是什么?哈希值代表的是什么?)

在object类的源代码中,有hashcode()

这是本地的,换句话说,你要是不做,它用的是系统的(说的这些可能都和native有关),是由windows帮我们算的。人家在帮你算,在内存中要放在哪儿。其实应该先走虚拟机等等(这里有一块儿细节,现在没有谈论到,先不管)。这个方法帮我算了一个具体的对象位置存在,这里面涉及数据结构,但是我们还没学数据结构,没法讲述,所以我们只能说它是个内存地址。

既然说是用hashcode()方法算的,那我们来看看。

注意是将内部地址转换。

这里面涉及一个转换动作,java不需要直接调用该方法就行。

接下来开始调用hashcode方法

再将程序修改一下,编译运行

DOS的结果显示,输出p1和p1的hashcode是不一样的。

Ca0b6是十六进制,827574是十进制。我们现在把十进制转换为十六进制。

 

DOS显示两者是一样了,但是为什么不同输出时,数值在变动呢?

把十进制转换成十六进制,显示短一些。

现在进一步进行扩展,对于原有的hashcode不满意。现在想对人具备的特有数据,来进行哈希值的定义。

覆盖每个对象原有的hashcode方法,每个人年龄都不一样,访问每个人的年龄可不可以?可以,我们以人的年龄来作为哈希值。这么一弄,就变得不一样了。(对hashcode的修改真是奇怪?如果抛开hashcode特有的观点,其实方法体里面怎么书写都无所谓)

修改之后,看原先程序的输出是怎样的

DOS结果显示两者都是一样的,(由于程序中已经设置好进制转换,所以结果肯定都是一样的,不应该的是十六进制么?)

程序中年龄是20,是十进制,转换成十六进制就是14。

一句话,哈希值是可以自己来实现的。依据对象的特点不同,我们建立它的不同的地址值,哈希值。

真正比较两个对象是否相等,看的就是这两个对象的哈希值是否相等,如果内容也是一样的,这时才能视为两个对象是一样的。判断equals不行,判断这个才给力。但是这个得涉及到数据结构,就是哈希表。

Equals方法重写和地址值有关系么?

光说内容相等不行,还得是哈希值相同。

这块的知识点,将会在集合框架中应用。

原文地址:https://www.cnblogs.com/wsw-bk/p/8026231.html