在面试中,经常会被问到euqals()与==有什么区别,估计很多人都会回答:前者是比较值,后者是比较内存地址,其实这只对了一般吧,我感觉。
首先==确实是比较对象的内存地址,这个毫无疑问,而euqals()呢?
其实euqals()是object类中的一个方法,查看源码:
public boolean equals(Object o) {
return this == o;
}
原来euqals()也是做了==运行。是不是跟很多人想的不太一样呢?至少跟我原来想的不太一样。
而为什么会说euqals()是值比较呢?其实euqals()这个方法是可以被重写的,而String,Integer就重写了它。
先看看String 的euqals()是怎么样的,
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;
}
核心是每个字符作比较。
再来看看Integer的euqals()
@Override
public boolean equals(Object o) {
return (o instanceof Integer) && (((Integer) o).value == value);
}
核心也是值比较。
所以,得出结论如下:
1.在没有重写euqals()的情况下,==与euqals()得到的结果是一样的,都是内存地址比较。
2.在String,Integer类中,因为重写了euqals(),所以euqals()是值比较,而==依然是内存地址比较。