重写Object方法——equals、hashCode
Object类中的equals和hashCode
Object类中的equals和hashCode是我们默认使用的方法。java中判断两个对象相等时有如下规则:
1)判断两个对象的hashCode是否相等
如果不相等,认为两个对象不相等
2)如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象不相等
如果相等,认为两个对象相等
在Object类中,equals方法判断两个引用是否指向同一对象,其与运算符"=="类似,然而很多类中都需要重写equals和hashCode方法,以产生新的定义。接下来以Lab2中的Edge类为例,说明下重写equals、hashCode方法的目的和作用。
重写equals方法
Edge < L >类属性如下:
private L source, target;
private int weight;
其包含一个起点,一个终点,一个边的权值。我们要判断两条edge相等时,只需在属性都非空的情况下判断起点、终点、权值分别相等即可。对此我们可以进行如下重写:
@Override
public boolean equals(Object obj)
{
if(!(obj instanceof Edge))
{
return false;
}
if(getClass()!=obj.getClass())
{
return false;
}
Edge<L> edObj = (Edge<L>) obj;
if(this == edObj)
{
return true;
}
if(edObj.source.equals(this.source)&&edObj.target.equals(this.target)&& edObj.weight == this.weight)
{
return true;
}
else
{
return false;
}
}
instanceof是一个双目运算符,用来判断obj 为 Edge 的对象,或者是其直接或间接子类,或者是其接口的实现类,否则返回false; getClass() 方法用于获取对象运行时对象的类。接下来将obj转换为Edge泛型,this==edObj说明地址相等,返回true;地址不等时若起点、终点、权重等属性相等也返回true,否则返回false.
重写hashCode方法
如果你重写了equals方法,那么一定要记得重写hashCode()方法,因为hashCode方法是为哈希表服务的,当我们在使用形如HashMap, HashSet这样前面以Hash开头的集合类时,hashCode就会被隐式调用以来创建哈希映射关系。
重写hashCode如下:
@Override
public int hashCode()
{
int result = 17;
result = 31*result + (source == null ? 0 : source.hashCode());
result = 31*result + (target == null ? 0 : target.hashCode());
return result;
}
首先定义一个初始值,一般来说取17
int result = 17;
接下来对于涉及计算的各个属性将其依次应用于下式:
result = result * 31 + (XXXX == null? 0 : XXXX.hashCode()); //XXXX为类的属性