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




猜你喜欢

转载自blog.csdn.net/ghj751105352/article/details/79172497
今日推荐