博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA-初步认识-第十一章-object类-Hashcode方法
阅读量:5015 次
发布时间:2019-06-12

本文共 1135 字,大约阅读时间需要 3 分钟。

一.

除了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

你可能感兴趣的文章
关于C语言中return的一些总结
查看>>
Codeforces Round #278 (Div. 2)
查看>>
51. N-Queens
查看>>
Linux 命令 - 文件搜索命令 locate
查看>>
[Grunt] grunt.template
查看>>
Ubuntu最小化桌面快捷键Super+D不生效解决
查看>>
Cookie&Session会话跟踪技术
查看>>
UNIX环境高级编程 第17章 高级进程间通信
查看>>
ES的Zen发现机制
查看>>
【hibernate】1、Hibernate的一个注解 @Transient
查看>>
HihoCoder 1877 - Approximate Matching
查看>>
Elastic Search 语法总结
查看>>
py自动化之环境配置
查看>>
Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)
查看>>
红黑树-想说爱你不容易
查看>>
【题目】英文字符进行频率的统计,直方图输出
查看>>
LeetCode-Binary Tree Level Order Traversal
查看>>
COM组件开发实践
查看>>
yii2 源码分析1从入口开始
查看>>
浅谈网站推广
查看>>