zoukankan      html  css  js  c++  java
  • 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方法重写和地址值有关系么?

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

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

  • 相关阅读:
    企业级 SpringBoot 教程 (九)springboot整合Redis
    03 网格系统
    02 表单
    01 排版
    客户端调用webSerices
    sql 一行转多行
    sql 多行转一行
    时间差计算 Stopwatch
    sql 游标
    Linq连接查询
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8026231.html
Copyright © 2011-2022 走看看