在看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