1. 约定
- 若两个对象调用equals()方法都返回true,则它们的hashcode一定相等;若两个对象的hashcode相等,不能说明equals()
也相等; - 若两个对象的hashcode不相等,则可确定这两个对象equals()一定不想等
- equals()默认是使用==实现的.
2. hashcode的作用:向集合中插入数据时,快速定位元素的位置,减少equals()比较的次数
3. 重写equals()方法时尽量要重写hashCode()方法,hashCode 方法的常规约定如下:
-
程序执行期间只要对象 equals 方法比较操作所用到的信息没有被修改,则对这同一个对象无论调用多次 hashCode 方法都必须返回同一个整数。
-
如果两个对象根据 equals 方法比较是相等的则调用这两个对象中任意一个对象的 hashCode 方法都必须产生同样的整数结果。
-
如果两个对象根据 equals 方法比较是不相等的,则调用这两个对象中任意一个对象的 hashCode 方法不一定要产生相同的整数结果(尽量保证不相等的对象产生截然不同的整数结果是可以提高散列表性能的)。
4. 重写equals()方法实例
/**
* @desc 覆盖equals方法
*/
@Override
public boolean equals(Object obj){
// 1. 检测obj是否为null, 是, 返回false;
if(obj == null){
return false;
}
// 2. 如果是同一个对象返回true,反之返回false
if(this == obj){
return true;
}
// 3. 判断是否类型相同, (关于getClass(),下面有专门代码展示)
if(this.getClass() != obj.getClass()){
return false;
}
// 4. 如果子类语义相同,使用instanceof检测:
if(!(obj instanceof Person)){
return false;
}
// 5. 将obj转化为相对应的类型变量person
Person person = (Person)obj;
// 6. 对所需要的比较的数据域进行比较. 如果是基本数据类型,使用a==b比较; 如果是对象比较,调用Objects.equals(a, b)进行比较
return name.equals(person.name) && age==person.age;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (name == null ? 0 : name.hashCode());
result = 31 * result + (age == null ? 0 : age.hashCode());
return result;
}
注: 第3步中.this.getClass() != obj.getClass()注释
class Parent {
public void study(int n) {
System.out.println("final method study(int n)" + n);
}
}
public class Child extends Parent{
public void study(int n) {
System.out.println("---StaticFinalDemo end---");
}
public static void main(String[] args) {
Child child = new Child();
Parent s1 = new Parent();
Parent s2 = new Child();
System.out.println(s1.getClass().getName()); // com.Parent
System.out.println(s2.getClass().getName()); // com.Child
System.out.println(child.getClass().getName()); // com.Child
}
}
第4步. 如果子类语义相同,使用instanceof检测
class Parent {
public void study(int n) {
System.out.println("final method study(int n)" + n);
}
}
public class Child extends Parent{
public void study(int n) {
System.out.println("---StaticFinalDemo end---");
}
public static void main(String[] args) {
Child child = new Child();
Parent s1 = new Parent();
Parent s2 = new Child();
System.out.println(child instanceof Parent); // true
System.out.println(s1 instanceof Parent); // true
System.out.println(s2 instanceof Parent); // true
System.out.println(s2 instanceof Child); // true
System.out.println(s1 instanceof Child); // false
System.out.println(null instanceof Object); // false
}
}