equals方法

  • object中的equals方法的底层主要中的==实现
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
 }
  • ==的两边若是引用类型,则比较的是两者的内存地址,内存地址一致则为true,反之为false
  • object中的equals方法自然也是比较引用的内存地址,这样设计的目的是判断两对象是否为同一个
  • java中两字符串的比较必须用equals,不能用==
  • 现实的业务逻辑中,应该比较对象的内容,比如用户对象,如果用户的姓名和密码相同,就应该返回true,认为是同一个对象,所以,这是就应该重写equals方法
public class EqualsTest {
    public static void main(String[] args){
        EqualsTest elt=new EqualsTest();
        elt.test02();
    }
    public void test01(){
        User u1=new User("chen","123");
        User u2=new User("chen","123");
        System.out.println(u1==u2);//false,开辟了两块内存,它们的内存地址当然不一样,虽然表面上看他们的内容一样
        System.out.println(u1.equals(u2));//重写后为true,重写前为false
        if(u1.equals(u2)){//没重写时这里的equals和==的效果是一样的,因为equals的底层就是'=='实现的
            System.out.println("对象u1和u2在内存中的地址一样,两者是一个对象");
            System.out.println("u1="+u1);
            System.out.println("u2="+u2);
        }else{
            System.out.println("虽然两个对象的内容一致,但其内存地址不一样,不是同一个对象");
            System.out.println("u1="+u1);
            System.out.println("u2="+u2);
        }
    }

    public void test02(){
        User u=new User("chen","123");
        User u1=u;
        System.out.println(u.equals(u1));
        if(u1.equals(u)){//true
            System.out.println("u1与u的内存地址一致,指向堆中同一个对象");
            System.out.println("u1="+u1);
            System.out.println("u="+u);//完全一致
        }else{
            System.out.println("两者地址不一致,不是同一个对象");
        }
    }
}

class User{
    String name;
    String password;
    User(String name,String password){
        this.name=name;
        this.password=password;
    }


    /*java中equals的实现源码
    *  public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
    * */

    //Object中的equals比较的是内存地址是否一致,判断两对象是否为同一个
    //但在实际的业务需求中,这样肯定是不够的,应该比较对象的内容是否相同,
    //比如这个user类中,只要用户名和密码相同,我们就认为两个对象是相等的
    //因此,要重写equals方法
    public boolean equals(Object o){
        if(this==o){//内存地址相同时,两对象相等
            return true;
        }
        if(o instanceof User){//内容相同时两对象也相等的
            User u=(User)o;
            if((u.name).equals(this.name)&&(u.password).equals(this.password)){
                return true;
            }
        }
        return false;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值