==和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方法,让其比较的是两个对象的内容是否一样。