【java编程】重写HashCode和equals方法

【一】重写equals方案的规则

equals方法本来的原则 

1、类的每个实例本质上都是唯一的。

2、不关心类是否提供了“逻辑相等”的测试功能

3、超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的。

4、类是自有的活是包级私有的,可以确定equals方法永远不会被调用。这个时候就要重写,防止被外界调用。

equals方法实现了等价关系。

1、自反性:对于任何非null的引用值x.则必须满足x.equals(x)必须返回true

2、对称性:对于任何非null的引用x,y.   x.equals(y)返回true,则y.equals(x)必须返回true

3、传递性:对于任何非null的引用x,y,z。则x.equals(y)返回true,y.equals(z)返回true.则x.equals(z)必须返回true

4、一致性:对于任何非null的引用x,y。只要对象里的信息没有被修改。x.equals(y)多次调用,要么一直返回true,要么一直返回false

5、对于任何非null的引用值x.x.equals(null)必须返回false
【二】重写hashCode方法的规则

覆盖了equals时,总要覆盖hashCode方法。

一个重写hashCode和equals的实例

import org.apache.commons.lang3.StringUtils;

/**
 * 
 */
public final class Category {
    private volatile int hashCode = 0;
    private final boolean nullOrEmptyIsCached;
    private final int initialCapacity;
    private final long maxSize;
    private final long timeOut;
    private final String cacheKey;

    public Category(int initialCapacity, long maxSize, long timeOut, String cacheKey, boolean nullOrEmptyIsCached) {
        this.initialCapacity = initialCapacity;
        this.maxSize = maxSize;
        this.timeOut = timeOut;
        this.cacheKey = cacheKey;
        this.nullOrEmptyIsCached = nullOrEmptyIsCached;
    }

    @Override
    public int hashCode() {
        int internalHashCode = hashCode;
        if (internalHashCode == 0) {
            int nullOrEmptyIsCachedInt = nullOrEmptyIsCached ? 1 : 0;
            internalHashCode = 31 * internalHashCode + nullOrEmptyIsCachedInt;
            internalHashCode = 31 * internalHashCode + initialCapacity;
            int mS = (int) (maxSize ^ (maxSize >>> 32));
            internalHashCode = 31 * internalHashCode + mS;
            int tO = (int) (timeOut ^ (timeOut >>> 32));
            internalHashCode = 31 * internalHashCode + tO;
            if (StringUtils.isNotEmpty(cacheKey)) {
                internalHashCode = 31 * internalHashCode + cacheKey.hashCode();
            }
            hashCode = internalHashCode;
        }
        return internalHashCode;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Category)) {
            return false;
        }
        Category otherCategory = (Category) obj;
        return this.nullOrEmptyIsCached == otherCategory.nullOrEmptyIsCached && this.initialCapacity == otherCategory.initialCapacity && this.maxSize == otherCategory.maxSize && this.timeOut == otherCategory.timeOut && (this.cacheKey == null ? this.cacheKey == otherCategory.cacheKey : this.cacheKey.equals(otherCategory.cacheKey));
    }
//省略sett,gett
}
View Code
原文地址:https://www.cnblogs.com/shangxiaofei/p/9245157.html