深入理解java中的“==”与equals()方法

首先强调一下“==”比较的永远都是地址值。

这个时候初学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;
}

猜你喜欢

转载自blog.csdn.net/hotchange/article/details/79727679