美文网首页
初识 对象与hashCode

初识 对象与hashCode

作者: 张航_8ee7 | 来源:发表于2017-12-25 17:56 被阅读0次

hashCode 是什么。

官方规定:

其实 通俗点 来讲,hashCode 将 对象的内存地址转化为一个 数字返回。然后有几个 规范:

【1】 两个对象的equals 相等 则他们的hashCode 一定相等。 (注意:这里讲得equals 只是 Object  的 方法,不是其子类覆写的方法)

【2】两个对象的equals  不相等,则hashCode 不一定相等。(其实大部分都是不相等的,只有一少部分会相等,因为设计的hashCode 规范,最好保证不同的对象返回不通的 hashCode,以来提高hash表性能)

【3】 hsahCode 不相等,对象equals 一定不相等。

【4】 hsahCode 相等,对象可能相等,也可能不想等。

那里用到hashCode

对于集合里的list 和数组来说,其实 hashCode作用 几乎可以无视了。 主要是我们使用HashMap HashTable  HashSet 之类的时候。

为什么以上集合可以判断该对象已经插入进来呢?

我们可以通过 obj.equals,来确定对象的唯一性,但是,数据量上去的时候,就会进行很多次的比较,比较麻烦。 hashCode 的出现就是解决这个问题。

当我们将一个对象插进去集合时,先会调用该对象的hashCode 方法,来判断该对象是否在这个集合里。如过不在该集合里,则直接存进去,不进行任何比较。有一个table来存储该集合所有对象的hashCode值。如果存在,则先比较equals 是否相等,如果相等,则抛出去,不存储。如果不相等,则散列到其他地方,所以可能存在不同对象的hashCode 是相同的,也引出了一个地址冲突(是不是可以说,一个hashCode 存了多个不同对象)。

我们分析 如下:

当执行到 第 33 行时,new HashObj()  代码被执行,先去map的table里去查找该对象的hashCode 是否存在,发现没有存在,则不在执行equals 方法。打印 执行 hashCode。

当执行到 第 34 行时,new HashObj()  代码被执行,发现 map的table 已经有了 hashCode ==1 的值,所以要在去equals一下,所以执行顺序是 

执行 hashCode ==》 执行 equals。 (我在这里重写了  object的 hashCode 方法 和equals 方法,所有 的hashCode 都是1。)

hashCode与equals

当我们重写一个 对象的 equals 方法时,一定要重写他的 hashCode 方法。 为什么?

看这段代码。 我们定义 当对象的名字和年龄相同时,则对象是一个人。

但是如果我们不去重写 对象的hashCode 方法时,在执行第23行代码时,最后的打印是个 null。原因很简单了,一个p1 ,一个p2,对应的hashCode肯定是不相同的,所以map 去自己的table 表里拿相应应记录时,用的是两个不同的hashCode,所以拿不到。

但是我们对象的属性完全相同,这应该就是同一个对象才对,我们的本意应该就是让该对象可以拿得到。

这个时候只要让对象的hashCode可以在保持相等。

我们对象返回的hashCode 就是基于自己属性和位置的一个int 值。

最后只要重写我们的hashCode ,如上。就可以了。

参考博文 : http://myhadoop.iteye.com/blog/2059833

                    http://www.importnew.com/20381.html

                    http://blog.csdn.net/fenglibing/article/details/8905007

                    https://www.cnblogs.com/dolphin0520/p/3681042.html

相关文章

  • 初识 对象与hashCode

    hashCode 是什么。 官方规定: 其实 通俗点 来讲,hashCode 将 对象的内存地址转化为一个 数字...

  • Java基础之hashcode与equals

    hashCode 与 equals (重要) 问题: HashSet如何检查重复? 两个对象的 hashCode(...

  • 11.03

    a.hashCode() 有什么用?与 a.equals(b) 有什么关系?hashCode() 方法是相应对象整...

  • Java基础-equals()和hashCode()

    1.equals()和hashCode()干嘛的? equals(Object obj)返回该对象是否与参数对象“...

  • java基础-2018-05-13

    Hashcode的作用 hashCode主要是用于数据的查询快捷性。 两个对象的hashCode相同,但对象不一定...

  • equals和hashcode,他们为何必须一起重写?

    1)hashcode方法 HashMap的put函数 如不重写hashCode 某个类的对象a 对象b 属性一样而...

  • Map集合中对象作为键值

    对象作为键值如果要保证同一个对象的唯一性,要用hashcode作为键值对象,即在对象类中重写hashcode方法

  • hashcode问题

    什么是hashcode hashcode主要是用来在散列存储结构中确定对象的存储地址。通过hashcode找到数组...

  • hashCode到底有什么用?

    hashCode概念 hashCode是jdk根据对象的地址算出来的一个int数字,即对象的哈希码值,代表了该对象...

  • Java 基础之 Equals与HashCode

    HashCode介绍 HashCode是object类的一个方法,用来生成该对象的hashCode值,主要为了提高...

网友评论

      本文标题:初识 对象与hashCode

      本文链接:https://www.haomeiwen.com/subject/uockgxtx.html