为什么重写equals
先说一说 == 比较
对于基本数据类型 == 比较的是数值
对于引用数据类型 == 比较的是地址
我们在初学Java时,String类我们会使用equals来比较两个字符串的值是否相等
有些同学就会误认为equals比较的是引用类型的值。
但实际上,所有对象继承自Object类。默认情况下,equals比较的仍然是地址。
我们来看一看Object中equals方法的源码
public boolean equals(Object obj) {
return (this == obj);
}
this代表代用该方法的对象,obj表示要比较的对象。
我们发现,equals方法又回到了两者用等于号比较。
即引用数据类型 == 比较的是地址。
那为什么String类调用equals比较的是值呢?
因为String类重写了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;
}
首先还是用==号比较,如果地址相同。两者当然也相同。
然后下一步,将里面的值进行了比较。
对于大部分Java原生对象,大多都重写了equals方法。
如果不确定,可以ctrl+鼠标左键点击进行查看。
所以我们在自定义对象时,如果不重写equals方法。
那么比较的将是两个对象的地址,即使值相同。但两者地址不同,仍然会判断为不相等。