HIT2019春软件构造->重写hashCode()方法

 不须要重写equals方法:数组

    1.     一个类的每个实例本质上都是惟一的。测试

    2.     不关心一个类是否提供了“逻辑相等”的测试功能对象

    3.     超类已经改写了equals方法,而且从超类继承过来的行为对于子类也是合适的。继承

    4.     一个类时私有的或者是package私有的,而且能够肯定它的equals方法永远不会被调用。(这种状况下最好将equals方法改写成如下方式:递归

        public boolean equals(Object obj){hash

            throws new UnsupportOperationException();
        }it

 

    只有当一个类有本身特定的“逻辑相等”概念,并且超类也没有改写equals以实现指望的行为,咱们须要改写equals方法。一般适用于“值类”。io

    在改写equals方法时,也要遵照他们的通用约定(equals方法实现了等价关系):变量

        1.     自反性:x.equals(x) = true;引用

        2.     对称性:若是有x.equals(y) = true,那么必定有y.equals(x) = true;

        3.     传递性:对任意的x,y,z。若是有x.equals(y) = y.equals(z) = true,那么必定有x.equals(z)= true;

        4.     一致性:不管多少次调用,x.equals(y)总会返回相同的结果。

        5.     非空性(暂定):全部的对象都必须!=null;

 

  具体实现:

        1.     使用==操做符检查“实参是否为指向对象的一个引用”,若是是则返回true;

        2.     使用instanceof操做符检查“实参是否为正确的类型”,若是不是,则返回false;

        3.     将实参换为正确的类型;

        4.     对于该类中的每个关键域,检查实参中的域与当前对象中对应的域是否匹配。若是全部测试都成功,则返回true,不然返回false。

        5.     方法完成以后,肯定equals方法的对称性,传递性,一致性。

 

  注意:
        1.改写equals方法的时候,必须改写hashCode方法;

        2.不要把equals声明中的Object对象替换为其余类型;

       public boolean equals(Object obj){

      //To do

     }

 

  hashCode的通用约定以下:

        1.     只要对象equals方法涉及到的关键域内容不改变,那么这个对象的hashCode老是返回相同的整数。

    (若是关键域内容改变,则hashCode返回的整数就能够改变)。

        2.     若是两个对象的equals(Object obj)方法时相等的,那么调用这两个对象中的任意一个对象的hashCode方法必须产生相同的整数结果。

    若是两个对象equals方法不一样,那么一定返回不一样的hashCode整数结果。(即相等的对象必须有相等的hashCode);

 

  产生hashCode的方法:

        1.     把某个非零常数值保存在一个叫作result的int类型的变量中

        2.     为该对象中的每个关键域f计算int类型的散列码。

            a)      为该域计算int类型的散列码c:

                i.若是域是Boolean类型,计算:(f?0:1)

                ii.若是是byte,char,short,int类型,计算:(int)f

                iii.若是是long类型,计算:(int)(f^(f>>32))

                iv.若是是float类型,计算:Float.floatToIntBits(f)

                v.若是是double类型,计算Double.doubleToLongBits(f)获得long类型的值,在按照long值对待,继续进一步计算

                vi.若是是对象引用,递归调用hashCode方法计算,若是遇到为null的关键域,则返回0

                vii.若是是数组,将每个元素都当作单独的域来计算,递归应用上述规则 

            b)      按照下面公式,将获得的散列码c组合到result中

                result = 37*result + c;

        3.     return result;

        4.     写完以后,检查hashCode方法是否可以让相等的实例产生相等的散列码,出错须要找出错误缘由。

相关文章
相关标签/搜索