首先强调一下“==”比较的永远都是地址值。
这个时候初学java的小伙伴,看了这句话之后就懵了。
比如下面的这段代码
public void eq(int a,int b) {
a=10;
b=20;
c=10;
System.out.println(a==b);
}
a和b不是比较的他们的值吗?怎么就比较的是地址值了呢?
首先,我们需要了解一下a,b在内存中是怎么存放的。
其实a,b变量所占空间保存内容的并不是10和20,而是10,20所在常量池中位置的地址。
常量池还有一个特点就是不保存相同的数据,比如a,c的值都是10,即a,c其实保存的都是常量池中10所在位置的地址。
还不理解请看下图:
如果想更好的理解常量池是个什么鬼,请小伙伴们自己搜寻资料吧!
object中的equals()方法,其他类中的equals()方法都继承于object类。
object中equals()方法的源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
我们很明显的可以看到最基础的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;
}