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方法是否可以讓相等的實例產生相等的散列碼,出錯須要找出錯誤緣由。

相關文章
相關標籤/搜索