JavaEE 第八周

Hash Code 和 Equals 的学习笔记

一. Definition

     1)什么是Hash Code?

     hash code是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。至于hashcode的具体编码方式,比较复杂(事实上这个编码是可以由程序员通过继承和接口的实现重写的)。

     用最简单的方法来说,hashcode就是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。 一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。 最常用的地方就是在一堆东西里找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。

      2)什么是Equals?

      equals() 方法用于将字符串与指定的对象比较。

      这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true,否则,

         (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同;

   (2)判断两个对象是否是同一个类加载器加载的,不是则返回false;

   (3)如果是普通对象则将对象的属性放入hashmap中作为key, 属性中的值作为value,以此作为比较的方式。

二.  Feature:

      1)Hash code

       关于hashCode方法,一致的约定是:

       重写了euqls方法的对象必须同时重写hashCode()方法。

       如果2个对象通过equals调用后返回是true,那么这个2个对象的hashCode方法也必须返回同样的int型散列码

       如果2个对象通过equals返回false,他们的hashCode返回的值允许相同。(然而,程序员必须意识到,hashCode返回独一无二的散列码,会让存储这个对象的hashtables更好地工作。

      2)Equals

       按照约定,equals要满足以下规则。

        自反性:  x.equals(x) 一定是true

        对null:  x.equals(null) 一定是false

        对称性:  x.equals(y)  和  y.equals(x)结果一致

        传递性:  a 和 b equals , b 和 c  equals,那么 a 和 c也一定equals。

        一致性:  在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。

 三. Relationship

       1、equals方法用于比较对象的内容是否相等(覆盖以后);

       2、hashcode方法只有在集合中用到;

       3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等);

       4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

摘自:https://www.cnblogs.com/lulipro/p/5628750.html

         https://www.cnblogs.com/wangnuo/p/7744891.html

         https://www.cnblogs.com/keyi/p/7119825.html

原文地址:https://www.cnblogs.com/Z--Y/p/9065866.html