一.
除了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方法重写和地址值有关系么?
光说内容相等不行,还得是哈希值相同。
这块的知识点,将会在集合框架中应用。