【一】重写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
}