Java-对象相等判断
引用相等性和对象相等性
引用相等性
两个引用指向堆上同一个对象,成为引用相等
对象相等性
堆上两个对象使用equals方法+hashCode方法 都为true时 认为两个对象是相等的
if (a.equals(b) && a.hashCode() == b.hashCode()) {
// 两个引用指向同一个对象或者两个对象是相等的
}
equals和hashCode
equals
java中所有的类都集成自Object类,Object对equals方法的实现如下
public boolean equals(Object obj) {
return (this == obj);
}
因此在未对Object的equals方法做覆盖的时候,equals方法和"=="是相同的效果
equals通常用来比较两个对象的内容是否相等
==用来比较两个对象的地址是否相等。
JDK中说明了实现equals()方法应该遵守的约定:
1)自反性:x.equals(x)必须返回true。
2)对称性:x.equals(y)与y.equals(x)的返回值必须相等。
3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必须为true。
4)一致性:如果对象x和y在equals()中使用的信息都没有改变,那么x.equals(y)值始终不变。
5)非null:x不是null,y为null,则x.equals(y)必须为false。
hashCode
hashCode()在哈希表里面起作用,在往哈希表中(HashSet,HashMap)插入数据的时候,会先调用hashCode方法计算Object哈希码,使用这个哈希码来确定此对象在哈希表中的位置
hash码相同的情况
hash码相同时,再调用equals方法判断内容是否相同,如果相同,则认为是同一个对象,不再存储
hash码不相同的情况
hash码不相同,就分布在不同hash桶内
这就证明了,在hash表中,只要equals方法返回true,则hashcode一定相同,反过来则不一定,hashcode相同,equals为false,则元素在同一个hash桶内
JDK中对hashCode()方法的作用,以及实现时的注意事项做了说明:
1)hashCode()在哈希表中起作用,如java.util.HashMap。
2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。
3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。
4)如果两个对象使用equals()方法判断为不相等,则不要求hashCode()也必须不相等;但是开发人员应该认识到,不相等的对象产生不相同的hashCode可以提高哈希表的性能。
重写equals和hashCode例子
@Override
public boolean equals(Object another) {
if (this == another) {
return true;
}
if (another instanceof Person) {
Person anotherPerson = (Person) another;
if (this.getName().equals(anotherPerson.getName()) && this.getAge() == anotherPerson.getAge()) {
return true;
} else {
return false;
}
}
return false;
}
@Override
public int hashCode() {
int hash = 17;
hash = hash * 31 + getName().hashCode();
hash = hash * 31 + getAge();
return hash;
}
来源:CSDN
作者:墨玉先生
链接:https://blog.csdn.net/weidong22/article/details/87628522