关于Object类中的equals方法
1、equals方法的源代码
public boolean equals(Object obj) {
return (this == obj);
}
以上这个方法是Object类的默认实现。
2、SUN公司设计equals方法的目的是什么?
- 以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。equals方法是判断两个对象是否相等的。
3、我们需要研究一下Object类给的这个默认的equals方法够不够用!!!!
- 在Object类中的equals方法当中,默认采用的是判断两个java对象是否相等。==判断的是两个java对象的内存地址是否相等,我们应该判断两个java对象的内容是否相等。所以老祖宗的equals方法不够用,需要子类重写equals。
4、判断两个java对象是否相等,不能使用等等于,(因为) “==”比较的是两个
- 对象的内存地址。
示例代码:
public class ObjectTest02{
public static void main(String[] args){
// 判断两个基本数据类型的数据是否相等直接使用“==”就行。
int a = 100;
int b = 100;
// 这个“==”是判断a中保存的100和b中保存的100是否相等。
System.out.println(a == b); //true(相等) false(不相等)
// 判断两个java对象是否相等,我们怎么办?能直接使用“==”吗?
//创建时间对象t1
MyTime t1 = new MyTime(2022,8,14);//MyTime t1 = 0x1234;
//创建时间对象t2
MyTime t2 = new MyTime(2022,8,14);//MyTime t2 = 0x3698;
//比较t1与t2是否相等
//测试以下,比较两个对象是否相等,能不能使用“==”???
// 这里的“==”判断的是:t1中保存的对象内存地址和t2中保存的对象内存地址是否相等。
System.out.println(t1.equals(t2));
// 重写Object equals方法之前(比较的是对象内存地址)
/*
boolean flag = t1.equals(t2);
System.out.println(flag); //false
*/
//创建时间对象t3
MyTime t3 = new MyTime(2022,9,14);
System.out.println(t1.equals(t3));
MyTime t4 = null;
System.out.println(t1.equals(t4));
}
}
class MyTime{
private int year;
private int month;
private int day;
public MyTime(){
}
public MyTime(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
//继承Object类中的equals方法
//public boolean equals(Object obj){
// return (this == obj);
//重写Object类中equals方法方便判断两个对象的内容是否相等
/* public boolean equals(Object obj){
int year1 = this.year;
int month1 = this.month;
int day1 = this.day;
if(obj instanceof MyTime){
MyTime m = (MyTime)obj;
int year2 = m.year;
int month2 = m.month;
int day2 = m.day;
if(year1 == year2 && month1 == month2 && day1 == day2){
return true;
}
}
return false;
} */
/*
// 改良equals方法
public boolean equals(Object obj) {
// 如果obj是空,直接返回false
if(obj == null){
return false;
}
// 如果obj不是一个MyTime,没必要比较了 ,直接返回false
if(!(obj instanceof MyTime)){
return false;
}
// 如果this和obj保存的内存地址相同,没必要比较了,直接返回true。
// 内存地址相同的时候指向的堆内存的对象肯定是同一个。
if(this == obj){
return true;
}
// 程序能够执行到此处说明什么?
// 说明obj不是null,obj是MyTime类型。
MyTime t = (MyTime)obj;
if(this.year == t.year && this.month == t.month && this.day == t.day){
return true;
}
// 程序能到这里返回false
return false;
}
*/
//再次改良。
/*
public boolean equals(Object obj) {
// 如果obj是空,直接返回false
if(obj == null){
return false;
}
// 如果obj不是一个MyTime,没必要比较了 ,直接返回false
if(!(obj instanceof MyTime)){
return false;
}
// 如果this和obj保存的内存地址相同,没必要比较了,直接返回true。
// 内存地址相同的时候指向的堆内存的对象肯定是同一个。
if(this == obj){
return true;
}
// 程序能够执行到此处说明什么?
// 说明obj不是null,obj是MyTime类型。
MyTime t = (MyTime)obj;
return this.year == t.year && this.month == t.month && this.day == t.day ;
}
*/
//简洁重写equals方法
public boolean equals(Object obj){
if(obj == null || !(obj instanceof MyTime)){
return false;
}
if(this == obj){
return true;
}
MyTime t = (MyTime)obj;
return this.year == t.year && this.month == t.month && this.day == day;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94315.html