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方法不够用
4、判断两个Java对象内容是否相等,不能使用==,因为==比较的是两个对象的内存地址。
5、基本数据类型用双等号,对象与对象比较用equals()方法
6、equals重写要彻底
示例分析:
比较两个日期是否相等,由于Object类中的equals方法当中,默认采用的是“”判断两个java对象
是否相等。而“”判断的是两个java对象的内存地址,我们应该判断两个java对象的存储内容是否相等。
所以老祖宗的equals方法不能用,我们需要重写。
1.代码展示:
package Data;
public class DataTest {
public static void main(String[] args){
MyTime t1 = new MyTime(2020,6,20);
MyTime t2 = new MyTime(2020,6,20);
boolean flag = t1.equals(t2);
System.out.println(flag); //flag
}
}
class MyTime{
int year;
int month;
int day;
public MyTime(){
}
public MyTime(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public boolean equals(Object o){
int year1 = this.year;
int month1 = this.month;
int day1 = this.day;
if(o instanceof MyTime){
MyTime mytime2 = (MyTime) o;
int year2 = mytime2.year;
int month2 = mytime2.month;
int day2 = mytime2.day;
if(year1 ==year2 && month1 == month2 && day1 == day2){
return true;
}
}
return false;
}
}
2.改良一
我们知道一上来我们就判断是不是属于MyTime类,没有考虑引用是否指向空,以及这两个引用是否相等的情况,因为如果是这些情况,我们就可以直接判定相等或者不相等,不需要再做下一步的比较。
//改良
public boolean equals(Object o) {
if (o == null ) {
return false;
}
if (!(o instanceof MyTime)) {
return false;
}
if(this == o){
return true;
}
//程序能执行到这里说明什么?
//说明obj不是null,obj是MyTime类型
MyTime t = (MyTime) o;
if(this.year == t.year && this.month == t.month && this.day == t.day){ //短路与有不相等的直接返回错误
return true;
}
//程序能到这里返回false
return false;
3.改良二
我们再上一次改良基础之上,直接使用return 语句,因为短路与执行结果是ture或者false有不相等的直接返回错误
//再次改良
public boolean equals(Object o) {
if (o == null && !(o instanceof MyTime)) {
return false;
}
if(this == o){
return true;
}
//程序能执行到这里说明什么?
//说明obj不是null,obj是MyTime类型
MyTime t = (MyTime) o;
return this.year == t.year && this.month == t.month && this.day == t.day; //短路与执行结果是ture或者false有不相等的直接返回错误
}
最后:
其实一般重写equals之后形式大体上都类似
类似于这样:先判断是否指向空指针,
public boolean equals(Object o) {
if(o == null || !(o instanceof Complex)) return false;
if(this == o) return true;
Complex c = (Complex) o;
return (real1 == real2 && imag1 == imag2);
}
还有这样,所以稍加注意就好啦
public boolean equals(Object o) {
if(o == null || !(o instanceof User)) return false;
if(this == o) return true;
User c = (User) o;
if(this.name.equals(u.name) && this.addr.equals(u.addr)){
return true;
}
return false
}