• 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

  • 相关阅读:
    FZU 1894 志愿者选拔
    POJ 2823 Sliding Window
    POJ 3038 Flying Right
    xStream 的简单使用 xml to bean
    欧拉函数
    POJ题目分类
    POJ1039 Pipe
    linux进程间通信之消息队列
    欧几里得GCD及扩展
    win7的vmware中安装ubuntu 13.04看不到共享目录
  • 原文地址:https://www.cnblogs.com/Z--Y/p/9065866.html
Copyright © 2020-2023  润新知