关于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; } }