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

一.

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

a201f044203b636afcf083a40d2e52a2.png

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

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

b8a512c8fa818c71636704af03d5a42b.png

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

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

ac578c3f9307cc0e01118050de824300.png

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

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

90a08cdcef1a2e80b505b15903ecf7ec.png

a235e3a947522cbabd0631898a6c57a5.png

注意是将内部地址转换。

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

接下来开始调用hashcode方法

691402d44bd3ab91c2beec164c54d825.png

4ab135b230add79e612f5d22456cea01.png

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

13bc1b2e71bc2d0e65407960ff25aac8.png

8b47bd5222bb742c6a69233e280f56df.png

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

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

2a2739dad37afcd8bcb37d7957c214f4.png

62674abc0906cb297359fd241ac8a555.png

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

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

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

e99acd9b1ffe27fef836f40eb03c63d9.png

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

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

1e08cbd3e7d809a26062522757852d0c.png

e60f633f57e471a3a141ae5b3b7e3d86.png

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

f2fd3bed80e275103f378533a448510f.png

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

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

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

b971b648328752d3780d8c34cac38e03.png

2d31453be01a45b702c4989f9e65a2f3.png

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值