【源码学习之Object】--equals()方法

equels方法底层学习

1.源码中equels比较的是内存地址,其实也就是==,==比较的是内存地址。

//源码就这一行
public boolean equals(Object obj) {
        return (this == obj);
}

2.在没有重写equals方法前,测试结果。

private static UserJack user1 = new UserJack();

public static void test1(){
        user1.setName("jack");
        user1.setSex("男");

        UserJack user2 = new UserJack();
        user2.setSex("男");
        user2.setName("bella");

//此时user1 和 user2 不是一个内存地址
//没有重写的情况下 无论里面值是多少 都会返回false

        System.out.println(user1==user2);//false
        System.out.println(user1.equals(user2));//false
}
public static void test2(){
    user1.setName("jack");
    user1.setSex("男");

    UserJack user2 = user1;
    user2.setName("bella");
    user2.setSex("女");

//此时user1 和 user2 是一个内存地址
//没有重写的情况下 无论里面什么值 都会返回true

    System.out.println(user1==user2);//true
    System.out.println(user1.equals(user2));//true
}

3.看着idea重写的equal方法

@Override
public boolean equals(Object o) {
//直接比较两个地址
    if (this == o)
        return true;
//下面要学习getClass方法,我暂且理解为还是比较运行时的类
    //false || false
    if ((o == null) || (o.getClass() != this.getClass()))
        return false;
//强转后比较 属性值
    UserJack userJack = (UserJack) o;
    return name.equals(userJack.name) &&
            sex.equals(userJack.sex);
}
//还没学习
@Override
public int hashCode() {
    return Objects.hash(name, sex);
}

4.重写后测试比较

/**
 * 重写equals后
 */
public static void test3(){
    user1.setName("jack");
    user1.setSex("男");

    UserJack user2 = new UserJack();
    user2.setName("jack");
    user2.setSex("男");
//此时两个地址,直接比较地址返回false
//重写equals后比较的是属性,所以返回true
    System.out.println(user1==user2);//false
    System.out.println(user1.equals(user2));//true
}
public static void test4(){
    user1.setName("jack");
    user1.setSex("男");

    UserJack user2 = user1;
    user2.setName("bella");
    user2.setSex("女");
//此时是同一个地址,直接==返回true
//同一个地址,equals第一行比较地址,返回true,这里容易错。

    System.out.println(user1==user2);//true
    System.out.println(user1.equals(user2));//true
}
  • 总结:== 比较的是内存地址,equals本身底层是比较的内存地址,重写后比较的是属性。这和重写equals的具体实现有关。
  • 碰到的问题:getClass()方法、hashcode()方法。

猜你喜欢

转载自www.cnblogs.com/luruihua/p/12669014.html