在看rocketmq的源码的时候,发现了QueueData重写了hashCode,equal方法。下面简要对两者进行分析:
1、equal
Object类中默认的实现方式是 : return this == obj 。那就是说,只有this 和 obj引用同一个对象,才会返回true。
而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性。
按照约定,equals要满足以下规则。
2、hashCode@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; }
这个方法返回对象的散列码,返回值是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