【源码学习之Object】
equels方法底层学习
问题:重写equals方法,必须重写hashcode方法吗?
答:
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()方法。