分析==和equals的区别

本文详细探讨了Java中==和equals的区别。==在比较基本类型时对比内容,对于引用类型则是比较内存地址。而equals默认也比对内存地址,但通常我们会重写它以比较对象内容,如String类的equals方法比较字符串内容。未重写equals的类,如自定义的学生类,将按默认行为返回false。因此,理解这两个操作符的不同对于Java程序员至关重要。
摘要由CSDN通过智能技术生成

==和equals的区别的java程序员老生常谈的问题了,是一道经典的面试题。

🐷
这道题的答案在百度上去搜索,给出的答案大多都是:==比较类型,equals比较内容。显然,这样的回答虽然不错,但是太片面了,不容易理解。那么他们的区别到底是什么呢?

==

==是java提供给我们的运算符。

在做基本数据类型比较的时候,==比较的两个基本类型的内容是否一样,在做引用类型比较时,比较的两个引用对象的引用内存地址是否一样。

equals

首先我们看看equals的源码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

可以看到equals的源码也是简单的用到了==进行比较,所以在比较引用类型时比较的也是两个对象的内存地址,那为什么说equals比较的对象内容呢?

因为我们一般会对equals放进行重写。

如 String类对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;
    }

可以看到,String类就重写了equals方法,更改了默认比较两个String对象内存地址的规则,改为了比较两个String对象的内容,所以我们一般用equals方法比较两个String的值。

其他普通类重写equals

	学生类
public class XueSheng {
    private int nianLing;
    private String name;
    
    public XueSheng(){}
    public XueSheng(int nianLing,String name){
        this.nianLing = nianLing;
        this.name = name;
    }

    public void setNianLing(int nianLing) {
        this.nianLing = nianLing;
    }

    public int getNianLing() {
        return nianLing;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }



}

这个类没有重写equals方法,用它做比较:

public class m {
    public static void main(String[] args) {
        XueSheng xueSheng = new XueSheng(19,"张三");
        XueSheng xueSheng2 = new XueSheng(19,"张三");
        System.out.println(xueSheng.equals(xueSheng2));
    }
}

打印结果是false。因为默认equals比较的是内存地址,xueSheng和xueSheng2的内存地址不一样,所以为false。但是可以看到两个对象的年龄和姓名都是一样,如果我们想必较两个对象的内容就可以重写equals方法。

        @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        XueSheng xueSheng = (XueSheng) o;
        return nianLing == xueSheng.nianLing &&
                Objects.equals(name, xueSheng.name);
    }

重写后的equals方法比较的是两个学生对象的年龄和姓名。
再次进行比较

public class m {
    public static void main(String[] args) {
        XueSheng xueSheng = new XueSheng(19,"张三");
        XueSheng xueSheng2 = new XueSheng(19,"张三");
        System.out.println(xueSheng.equals(xueSheng2));
    }
}

打印结果为true。

总结:

==和equals的区别是,==用于比较两个对象的内存地址是否一样,而equals默认比较的也是两个对象的内存地址,但是我们一般会重写equals方法,让其比较的是两个对象的内容是否一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值