【java基础】Object类中equals()与HashCode()方法理解

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
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值