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
}
原文:https://www.cnblogs.com/luruihua/p/12669014.html