JavaSE中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方法不够用

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
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值