hashCode和equal的含義

         在看rocketmq的源碼的時候,發現了QueueData重寫了hashCode,equal方法。下面簡要對兩者進行分析:

1、equal

          Object類中默認的實現方式是  :   return this == obj  。那就是說,只有this 和 obj引用同一個對象,纔會返回true。
而我們往往需要用equals來判斷 2個對象是否等價,而非驗證他們的唯一性。

          按照約定,equals要滿足以下規則。

          

@Override
	public boolean equals(Object obj) {
		//1、自反性     x.equals(x) 一定是true
		if (this == obj)
            return true;
		//2、對null:  x.equals(null) 一定是false
        if (obj == null)
            return false;
        //3、 對稱性:  x.equals(y)  和  y.equals(x)結果一致
        //一致性:  在某個運行時期間,2個對象的狀態的改變不會不影響equals的決策結果,那麼,在這個運行時期間,無論調用多少次equals,都返回相同的結果。
        if (getClass() != obj.getClass())
            return false;
        //4、傳遞性:  a 和 b equals , b 和 c  equals,那麼 a 和 c也一定equals。
        QueueData other = (QueueData) obj;
        if (brokerName == null) {
            if (other.brokerName != null)
                return false;
        } else if (!brokerName.equals(other.brokerName))
            return false;
        if (perm != other.perm)
            return false;
        if (readQueueNums != other.readQueueNums)
            return false;
        if (writeQueueNums != other.writeQueueNums)
            return false;
        if (topicSynFlag != other.topicSynFlag)
            return false;
        return true;
	}

         2、hashCode

                 這個方法返回對象的散列碼,返回值是int類型的散列碼。
           對象的散列碼是爲了更好的支持基於哈希機制的Java集合類,例如 Hashtable, HashMap, HashSet 等。
           關於hashCode方法,一致的約定是:
                   重寫了euqls方法的對象必須同時重寫hashCode()方法。
                   如果2個對象通過equals調用後返回是true,那麼這個2個對象的hashCode方法也必須返回同樣的int型散列碼
                   如果2個對象通過equals返回false,他們的hashCode返回的值允許相同。(然而,程序員必須意識到,hashCode返 回獨一無二的散列碼,會讓存儲這個對象的hashtables更好地工作。)
                 

 定義一個int類型的變量 hash,初始化爲 1。
接下來讓你認爲重要的字段(equals中衡量相等的字段)參入散列運,算每一個重要字段都會產生一個hash分量,爲最終的hash值做出貢獻(影響)。

最後把所有的分量都總和起來,注意並不是簡單的相加。選擇一個倍乘的數字31,參與計算。然後不斷地遞歸計算,直到所有的字段都參與了。

@Override
	public int hashCode() {
		final int prime = 31;
        int result = 1;
        result = prime * result + ((brokerName == null) ? 0 : brokerName.hashCode());
        result = prime * result + perm;
        result = prime * result + readQueueNums;
        result = prime * result + writeQueueNums;
        result = prime * result + topicSynFlag;
        return result;
	}

參考文獻:https://www.cnblogs.com/lulipro/p/5628750.html

一次性搞清楚equals和hashCode




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章